1.Git介绍
开源的分布式版本控制系统,是目前世界上最先进最流行的版本控制系统.可以快高效处理很小到非常大的项目版本管理.
特性:
- 直接记录快照,而非差异比较
- 近乎所有操作都是本地执行
2.Git的基本操作
如果自己又一个尚未进行版本控制的项目目录,想要用Git控制.
- 在项目目录中,通过鼠标右键打开"Git Bash"
- 执行git init 命令将当前的目录转化为Git仓库
创建了一个名为.git的隐藏目录,是当前项目的git仓库,包含了初始化的必要文件,这些文件是Git仓库的必要组成部分.
2.1 检查文件状态
git status指令查看文件处于什么状态
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
test.html
Untracked files(未跟踪文件)
表示Git在之前的快照(提交)中没有这些文件;Git不会自动将之纳入跟踪范围,除非明确地告诉他"我需要使用Git跟踪管理该文件"
git status -s精简的返回文件状态
$ git status -s
?? test.html
两个红色问号也表示未跟踪文件
2.2 git add跟踪文件 后面加文件名
使用指令后再次运行git status会得到Changes to be committed 表示暂存状态 git status -s 时显示绿色是A加文件名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-exhcww43-1650010398026)(C:\Users\DELL\Desktop\git.jpg)]
2.3 提交更新git commit -m
-m选项后面是本次的提交信息,用来对提交的内容做进一步的描述
提交之后再次检测状态 得到以下信息:
$ git status
On branch master
nothing to commit, working tree clean
说明工作区的所有的文件都处于"未修改"的状态,没有任何文件需要被提交.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IqkILnKm-1650010398027)(Git.assets/1648395475(1)].jpg)
2.4 对已提交文件修改 未跟踪状态
修改文件后检查状态
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: test.html
modified表示已修改但未放入暂存区.
在-s简短表诉中 是一个大写的红色M.
暂存已修改文件
使用git add有三个功能
- 可以用它跟踪新文件
- 把已跟踪的且已修改的文件放到暂存区
- 把有冲突的文件标记未解决状态
运行git add后可以再次用git status -s去查看当前文件状态报告 绿色M表示已放入暂存区.(红色M:已修改未放入;M修改且放入)
$ git commit -m "test"
[master 14f3032] test
1 file changed, 1 insertion(+)
再次使用git commit -m可以提交已暂存的文件
再次查看得到
$ git status
On branch master
nothing to commit, working tree clean
表示所有文件都已提交到git仓库中保存.
2.5 撤销对文件的修改 git checkout – 文件名
把对文件去中对应文件的修改.
操作结果:所有的修改会丢失且无法恢复 危险性比较高 要慎重.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jt7vQ2Q9-1650010398027)(Git.assets/1648397808(1)].jpg)
撤销操作的本质: 用Git仓库中保存的文件,覆盖工作区中指定的文件.
2.6 向暂存区中一次性添加多个文件git add .
在项目开发中经常使用这个命令将新增和修改过后的文件加入暂存区
2.7 取消暂存的文件 git reset HEAD 加移除文件名
在后面加.可以把文件夹中所有文件移除暂存区
JiYuHan@DESKTOP-E75O14F MINGW64 ~/Desktop/gitTestFile (master)
$ git reset HEAD .
Unstaged changes after reset:
M test.txt
JiYuHan@DESKTOP-E75O14F MINGW64 ~/Desktop/gitTestFile (master)
$ git status -s
M test.txt
?? test2.txt
?? test3.txt
2.8 跳过使用暂存区域(跳过暂存区) git commit -a
default->git add->git commit
工作区->暂存区->git仓库
Git提供了一个跳过使用暂存区的方式,只要在提交时候,给git commit加上-a选项,Git就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add步骤:
git commit -a -m "提示消息"
$ git commit -a -m "修改test"
[master e53c30a] 修改test
2 files changed, 2 insertions(+)
JiYuHan@DESKTOP-E75O14F MINGW64 ~/Desktop/gitTestFile (master)
$ git status
On branch master
nothing to commit, working tree clean
2.9 移除文件
- 从Git仓库和***工作区(文件删除)***中同时移除对应的文件 git rm -f 文件名
- 只从Git仓库中移除指定的文件,但保存工作中对应的文件 git rm -cached 文件名
2.10 忽略文件
一般我们总会有些文件无需纳入Git的管理,也不希望它们总出现在未跟踪文件列表.在这种情况下,可以创建一个名为.gitignore的配置文件,列出要忽略的文件的匹配模式.
文件 .gitignore的格式规范如下:
- 以**#开头**的是注释
- 以**/结果**的是目录
- 以**/开头**是防止递归
- 以**!开头**表示取反
- 可以使用glob模式进行文件和文件叫的匹配(简化的正则表达式)
glob模式
- **星号 *** 匹配零或多个任意字符
- **[abc]**匹配任何一个列在方括号中的字符
- 问号? 只匹配一个任意字符
- 在括号中使用短横线分隔两个字符,表示所有在字符间范围可以匹配比如[0-9]
- **两个星号 **** 表示匹配任意中间目录
2.10.1 .gitignore文件的例子
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-earm2hhi-1650010398028)(Git.assets/image-20220328161627727.png)]
2.11 查看提交历史 git log
回顾项目的提交历史,git log. 按Q退出
会得到作者信息,邮箱,时间,提示消息,提交消息.
如果查看最近两条 git log -2
#在一行上展示最近两条提交历史的信息.
git log -2 --pretty=oneline
2.12 回退到指定的版本
指定的提交ID回退到指定邦本
git reset --hard
在旧版本中使用git reflog --pretty-noeline 查看命令操作历史
再次根据最新的提交ID 跳转到最新的版本
git reset --hard
GitHub
专门免费存放开源项目源代码的网站,叫做开源项目托管平台.
- Github
- Gitlab
- Gitee
远程仓库的两种访问方式
- HHTPS:零配置;但每次仓库时,需要重复输入Github的账号密码才能访问成功;
- SHH:需要进行额外的配置;但是配置成功后,每次访问仓库时,不需要重复输入账号密码;
实际开发中比较建议使用SHH
基于https将本地仓库上传到Github
在本地仓库中执行1指令,再执行2指令,后弹出窗口填写用户账号密码.
1. git remote add origin https://github.com/JiYvHan/project_1.git
2. git branch -M main
3. git push -u origin main/master
本地仓库中新建或者修改文件如何上传到github
在添加进去暂存区git add .后git commit -m提交仓库,第二次提交到github只需要在指令行中执行"git push"即可.再次刷新就可以在github中得到代码.
$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 347 bytes | 347.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/JiYvHan/project_1.git
0a475ec..201b837 master -> master
SSH key
- 实现本地仓库和Github之间免登陆的加密数据传输.
- 免登陆身份认证,数据加密传输.
- 两个组成部分
- id_rsa(私钥文件,存放于客户端的电脑中即可)
- id_rsa.pub(共钥文件,需要配置到Github中)
生成SSH key
- 打开Git Bash
- 输入命令 ssh-keygen -t rsa -b 4096 -C “2213655698@qq.com”
- 连续敲击3次回车,再C:\User\用户名文件夹\.ssh目录中生成id_rsa和id_rsa.pub
文件存在在这里: C:\Users\DELL.ssh
配置SSH key
- 使用记事本打开id_rsa.pub文件复制内容.
- 在浏览器中登陆Github,点击头像->Settings->SSH and GPG Keys->New SSH key.
- 将id_rsa.pub文件中的内容,粘贴到Key对应的文本框中.
- 在Title文本框中任意填写一个名称,来表示这个Key从何而来.
检测Github的SSH Key是否配置成功
ssh -T git@github.com 出现如下反馈就是配置成功
Hi JiYvHan! You've successfully authenticated, but GitHub does not provide shell access
执行如下命令将本地文件上传到github仓库上:
- git remote add origin git@github.com:JiYvHan/project_2.git
- git push -u origin master
将远程仓库克隆到本地 git clone +远程仓库地址
仓库地址:选中项目后找Code绿色按钮,可选择切换访问方式,复制链接即可.
JiYuHan@DESKTOP-E75O14F MINGW64 ~/Desktop/GitTest
$ git clone git@github.com:JiYvHan/project_2.git
Cloning into 'project_2'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
在运行指令后出现以上提示,文件克隆成功,文件名为github拷贝存放的文件名.
Git分支
本地分支操作 git branch
可以查看当前Git仓库中所有的分支列表(默认在master分支):
$ git branch
* master
创建新分支 git branch 分支名称
创建新分支后默认还是在master分支中,不会自动切换.
$ git branch login
$ git branch
login
* master
切换分支 git checkout 分支名称
$ git checkout login
Switched to branch 'login'
JiYuHan@DESKTOP-E75O14F MINGW64 ~/Desktop/GitTest/project_2 (login)
$ git branch
* login
master
执行后再次查看会变成login分支,同时提示也会显示分支名称.
分支的快速创建和切换(创建且立即切换) git checkout -b 分支名称
$ git checkout -b reg
Switched to a new branch 'reg'
JiYuHan@DESKTOP-E75O14F MINGW64 ~/Desktop/GitTest/project_2 (reg)
合并分支 git merge 分支名称
-
切换到master分支
git checkout master
-
在master 分支上运行 git merger命令,将login分支的代码合并到master分支``
git merger login
可以把login功能分支合并到master中,这样master就具备了login的功能(文件).
删除分支 git branch -d 分支名称
当把功能分支的代码合并到master主分支上以后,就可以使用如下命令删除对应的功能分支:
$ git branch -d login
Deleted branch login (was 2dfa062).
JiYuHan@DESKTOP-E75O14F MINGW64 ~/Desktop/GitTest/project_2 (master)
$ git branch
* master
reg
删除某个分支,不能正处于此分支中.(所以在master分支中删除了login分支)
遇到冲突时的分支合并
如果在两个不同的分支中,对同一个文件进行了不同的修改,Git就无法干净的合并它们.此时,我们需要打开这些包含冲突的文件然后 手动解决冲突.
冲突情况如下:
JiYuHan@DESKTOP-E75O14F MINGW64 ~/Desktop/GitTest/project_2 (master)
$ git merge reg
Auto-merging login.html
CONFLICT (content): Merge conflict in login.html
Automatic merge failed; fix conflicts and then commit the result.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xNJPRoZh-1650010398029)(Git.assets/1648706612(1)].jpg)
在VSCode中提供了支持,代码区域出现了当前修改与传入修改两个模块,在上方出现四个可选项,依次是:
- 保留当前修改,删除传入修改
- 保留传入修改,删除当前修改
- 保留双方修改
- 比较修改
在冲突解决后需要通知已解决冲突,执行命令: git add . git commit -m "解决了分支冲突的问题"
Git分支 - 远程分支操作
将本地分支推送到远程仓库
如果是第一次将本地分支推送到远程仓库,需要运行如下命令:
-u 表示把本地分支和远程分支进行关联,只是在第一次推送的时候需要 -u 参数
git push -u 远程仓库的别名 本地分支名称:远程分支名称
如果希望远程分支的名称和本地分支名称保持一直,可以对命令进行简化,省略最后的一个名称
$ git push -u origin reg:register
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 555 bytes | 555.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote:
remote: Create a pull request for 'register' on GitHub by visiting:
remote: https://github.com/JiYvHan/project_2/pull/new/register
remote:
To https://github.com/JiYvHan/project_2.git
* [new branch] reg -> register
branch 'reg' set up to track 'origin/register'.
再次打开github可以查看到register分支.
注意:第一次推送分支需要带-u参数,伺候可以直接使用git push 推送代码到远程分支.
查看远程仓库中的所有的分支列表 git remote show 远程仓库名称(默认为origin)
$ git remote show origin
* remote origin
Fetch URL: https://github.com/JiYvHan/project_2.git
Push URL: https://github.com/JiYvHan/project_2.git
HEAD branch: master
Remote branches:
master tracked
register tracked
Local branches configured for 'git pull':
master merges with remote master
reg merges with remote register
Local ref configured for 'git push':
master pushes to master (fast-forwardable)
跟踪分支
从远程仓库中,把远程分支下载到本地仓库中. 运行如下命令:
git checkout 远程分支的名称(不需要进行重命名)
如果下载且需要进行重命名 git checkout -b 本地分支名称 远程仓库名称/远程分支名称
JiYuHan@DESKTOP-E75O14F MINGW64 ~/Desktop/GitTest/project_2 (master)
$ git checkout -b reg origin/register
Switched to a new branch 'reg'
branch 'reg' set up to track 'origin/register'.
JiYuHan@DESKTOP-E75O14F MINGW64 ~/Desktop/GitTest/project_2 (reg)
$ git branch
master
* reg
拉取远程分支的最新代码 git pull
拉去当前分支最新的代码,报纸当前分支的代码和远程分支代码一致.
删除远程分支
git push 远程仓库名称 --delete 远程分支名称
$ git push origin --delete register
To https://github.com/JiYvHan/project_2.git
- [deleted] register
默认远程仓库名称是origin.
报错 因为分支代码没有合并到master主分支.
$ git branch -d reg
error: The branch 'reg' is not fully merged.
If you are sure you want to delete it, run 'git branch -D reg'.
强制删除reg分支不论是是否合并代码到master主分支.
$ git branch -D reg
Deleted branch reg (was 559893a).
总结
- git init
- git add .
- git commit -m “提交消息”
- git status 和 git status -s
- 能够配置 Github的SSH访问
- 能够将本地仓库上传到Github
- git checkout -b 新分支名称
- git push -u origin 新分支名称
- git checkout 分支名称
- git branch
branch -d reg
error: The branch ‘reg’ is not fully merged.
If you are sure you want to delete it, run ‘git branch -D reg’.
强制删除reg分支不论是是否合并代码到master主分支.
```git
$ git branch -D reg
Deleted branch reg (was 559893a).
总结
- git init
- git add .
- git commit -m “提交消息”
- git status 和 git status -s
- 能够配置 Github的SSH访问
- 能够将本地仓库上传到Github
- git checkout -b 新分支名称
- git push -u origin 新分支名称
- git checkout 分支名称
- git branch