Git里存在一个主分支,即master分支。HEAD指向master,而master则是指向提交的,所以,HEAD指向的就是当前分支。一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点。如下图(1)所示。
当创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。如上图(2)所示。从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变。如下图(3)所示。
当我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并。如上图(4)所示。合并完分支后,可以直接删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支了。回到上图(1)。
$ git checkout -b dev
Switched to a new branch 'dev'
//git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
$ git branch
* dev
master
//git branch命令会列出所有分支,当前分支前面会标一个*号。
//readme.txt文件新添加一行如下:
Creating a new branch is quick.
$ git add readme.txt
$ git commit -m "branch test"
[dev b17d20e] branch test
1 file changed, 1 insertion(+)
//dev分支的工作完成,现在可以切换回master分支
$ git checkout master
Switched to branch 'master'
切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变。分支逻辑图如下所示。
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。合并完成后,就可以放心地删除dev分支了。
$ git branch -d dev
Deleted branch dev (was b17d20e).
在使用git过程中,合并分支往往不是一帆风顺的。当在不同分支上提交同名文件时,如果同名文件中相同的行的内容存在差异时,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突。
示例:
1 、准备新的feature1分支 ,并将修改后的readme.txt文件在feature1分支上提交:
$ git checkout -b feature1 //创建并切换到新的分支feature1上
Switched to a new branch 'feature1'
$ git add readme.txt //文件最后一行更改为:Creating a new branch is quick AND simple.
$ git commit -m "AND simple" //在分支feature1上提交readme.txt文件
[feature1 14096d0] AND simple
1 file changed, 1 insertion(+), 1 deletion(-)
//readme.txt —— 最后一行:
Creating a new branch is quick AND simple.
2 、切换到master分支 ,并将修改后的readme.txt文件在master分支上再次提交:
$ git checkout master //切换到master上,Git还会自动提示我们当前master分支比远程的master分支要超前1个提交。
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
$ git add readme.txt //文件最后一行更改为:Creating a new branch is quick & simple.
$ git commit -m "& simple" //在分支master提交readme.txt文件
[master 5dc6824] & simple
1 file changed, 1 insertion(+), 1 deletion(-)
//readme.txt —— 最后一行:
Creating a new branch is quick & simple.
3 、master分支和feature1分支各自都分别有新的提交,逻辑线变成了下图(5)这样:
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,操作如下(git merge feature1)。Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
git status也可以告诉我们冲突的文件:
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
4 、直接查看readme.txt的内容:(Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容)
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple. //HEAD指向的master分支上的冲突内容
=======
Creating a new branch is quick AND simple. //feature1分支上的冲突内容
>>>>>>> feature1
5 、修改冲突行如下后保存,再提交。现在,master分支和feature1分支变成了上图(6)所示:
//修改冲突行
Creating a new branch is quick and simple.
//再次提交
$ git add readme.txt
$ git commit -m "conflict fixed"
[master cf810e4] conflict fixed
6 、删除feature1分支:
$ git branch -d feature1
Deleted branch feature1 (was 14096d0).
参考:https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344