本章开始介绍 Git 的杀?级功能之?(注意是之?,也就是后?还有之?,之三……):分?。分?就是科幻电影??的平?宇宙,当你正在电脑前努?学习 C++ 的时候,另?个你正在另?个平?宇宙?努?学习 JAVA
如果两个平?宇宙互不?扰,那对现在的你也没啥影响。不过,在某个时间点,两个平?宇宙合并了,结果,你既学会了 C++ ?学会了 JAVA!
在版本回退?,你已经知道,每次提交,Git都把它们串成?条时间线,这条时间线就可以理解为是?个分?。截?到?前,只有?条时间线,在Git?,这个分?叫主分?,即master分?。再来理解?下HEAD,HEAD严格来说不是指向提交,?是指向master,master才是指向提交的,所以,HEAD指向的就是当前分?
每次提交,master分?都会向前移动?步,这样,随着你不断提交,master分?的线也越来越?,?HEAD只要?直指向master分?即可指向当前分?
通过查看当前的版本库,我们也能清晰的理出思路
@139-159-150-152:~/gitcode$ cat .git/HEAD
ref: refs/heads/master
@139-159-150-152:~/gitcode$ cat .git/refs/heads/master
5476bdeb12510f7cd72ac4766db7988925ebd302
Git?持我们查看或创建其他分?,在这?我们来创建第?个??的分?dev ,对应的命令为:
@139-159-150-152:~/gitcode$ git branch #查看当前本地所有分?
* master
@139-159-150-152:~/gitcode$ git branch dev #新建分?dev
@139-159-150-152:~/gitcode$ git branch
dev
* master
当我们创建新的分?后,Git新建了?个指针叫dev, * 表?当前 HEAD指向的分?是 master 分?。另外,可以通过?录结构发现,新的 dev 分?
@139-159-150-152:~/gitcode$ ls .git/refs/heads/
dev master
@139-159-150-152:~/gitcode$ cat .git/refs/heads/*
5476bdeb12510f7cd72ac4766db7988925ebd302
5476bdeb12510f7cd72ac4766db7988925ebd302
发现?前dev和master指向同?个修改。并且也可以验证下HEAD?前是指向 master 的
@139-159-150-152:~/gitcode$ cat .git/HEAD
ref: refs/heads/master
那如何切换到dev分?下进?开发呢?使? git checkout 命令即可完成切换,?例如下:
@139-159-150-152:~/gitcode$ git checkout dev
Switched to branch 'dev'
@139-159-150-152:~/gitcode$ git branch
* dev
master
@139-159-150-152:~/gitcode$ cat .git/HEAD
ref: refs/heads/dev
我们发现HEAD已经指向了dev,就表?我们已经成功的切换到了dev上
接下来,在 dev 分?下修改ReadMe?件,新增??内容,并进??次提交操作
@139-159-150-152:~/gitcode$ vim ReadMe
@139-159-150-152:~/gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
write aaa for new branch
@139-159-150-152:~/gitcode$ git add .
@139-159-150-152:~/gitcode$ git commit -m"modify ReadMe"
[dev 3740dce] modify ReadMe
1 file changed, 1 insertion(+)
现在,dev分?的?作完成,我们就可以切换回master分?:
@139-159-150-152:~/gitcode$ git checkout master
Switched to branch 'master'
@139-159-150-152:~/gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
切换回master分?后,发现ReadMe?件中新增的内容不?了!!!赶紧再切回dev看看:
@139-159-150-152:~/gitcode$ git checkout dev
Switched to branch 'dev'
@139-159-150-152:~/gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
write aaa for new branch
在dev分?上,内容还在。为什么会出现这个现象呢?我们来看看dev分?和master分?指向,发现两者指向的提交是不?样的
@139-159-150-152:~/gitcode$ cat .git/refs/heads/dev
bdaf528ffbb8e05aee34d37685408f0e315e31a4
@139-159-150-152:~/gitcode$ cat .git/refs/heads/master
5476bdeb12510f7cd72ac4766db7988925ebd302
看到这?就能明?了,因为我们是在dev分?上提交的,?master分?此刻的提交点并没有变,此时的状态如图如下所?
当切换到master分?之时,HEAD就指向了master,当然看不到提交了!
为了在master主分?上能看到新的提交,就需要将 dev 分?合并到 master 分?,?例如下
@139-159-150-152:~/gitcode$ git branch
* dev
master
@139-159-150-152:~/gitcode$ git checkout master # 切换到 master 上进?合并
Switched to branch 'master'
@139-159-150-152:~/gitcode$ git merge dev # 合并 dev 分?
Updating 16623e1..3740dce
Fast-forward
ReadMe | 1 +
1 file changed, 1 insertion(+)
@139-159-150-152:~/gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
write aaa for new branch
git merge 命令?于合并指定分?到当前分? 合并后,master就能看到dev分?提交的内容了 此时的状态如图如下所?
Fast-forward代表“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度?常快当然,也不是每次合并都能Fast-forward,我们后?会讲其他?式的合并
合并完成后,dev分?对于我们来说就没?了,那么dev分?就可以被删除掉,注意如果当前正处于某分?下,就不能删除当前分?,如:
@139-159-150-152:~/gitcode$ git branch
* dev
master
@139-159-150-152:~/gitcode$ git branch -d dev
error: Cannot delete branch 'dev' checked out at '/home/hyb/gitcode'
?可以在其他分?下删除当前分?,如:
@139-159-150-152:~/gitcode$ git checkout master
Switched to branch 'master'
@139-159-150-152:~/gitcode$ git branch -d dev
Deleted branch dev (was bdaf528).
@139-159-150-152:~/gitcode$ git branch
* master
1 2 3 4 5 6 7
此时的状态如图如下所?
因为创建、合并和删除分??常快,所以Git?励你使?分?完成某个任务,合并后再删掉分?,这和直接在master分?上?作效果是?样的,但过程更安全