git merge合并分支
git通过git merge
操作将指定分支合并到当前分支上,这里的合并指的是将指定分支的修改合并到当前分支上。当git不知道如何合并时就会产生冲突。
# 本地有两个分支:master,beta
# 切换到master分支
git checkout master
# 将beta分支合并到当前分支master上
git merge beta
如果有冲突,在merge操作后会有提示信息:
$ git merge beta
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
手动打开产生冲突的文档(README.md)进行修改,再执行add和commit操作:
git add .
git commit -m "merge beta"
举个例子
$ git checkout master # 切换到master分支
$ cat README.md # 该分支下有一个README.md 文档
++++++++++ # 文档里的内容,就是一行“++++++++“
$ git checkout -b beta # 从master上拉出来一个beta分支
这时有两个分支master、beta分支,这两个分支上的内容是完全一样的。
制造一个冲突
分别修改这个分支下的master、beta分支下的README.md 文件,人为制造一个冲突。
- master
++++++++++
----------
- beta
++++++++++
**********
分别执行add,commit操作。
合并产生冲突
这时候将beta合并到master的时候就会产生冲突。
$ git checkout master
$ git merge beta
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
再打开README.md 就会发现文件已经被修改,同时保留master分支和beta不一样的地方里git无法自动合并的部分。
++++++++++
<<<<<<< HEAD
----------
=======
**********
>>>>>>> beta
解决冲突
手动将文件里的需要保留的保留,删除的删除,“<<<<<<< HEAD"与”======="之间是当前分支之前的修改,“=======”与“>>>>>>> beta”是beta分支上的修改,根据需要进行保留或者删除。
$ cat README.md # 这里是全部保留
++++++++++
----------
**********
$ git add .
$ git commit -m "merge beta"
再执行add和commit操作完成冲突合并。需求要push的这时再将当前分支push远程。
完成冲突合并。
冲突产生原因
通过git log --graph --decorate --oneline --all
命令可以以图的形式展示分支的commit和merge。
* 86b1868 merge beta
|\
| * 1e5848f ***
* | 05597db ---
|/
* 03dc8fd +++
为了方便表述,将每个commit用一个新的名称表示,03dc8fd:C1,05597db:C2,1e5848f:C3,86b1868:C4。
- C1在文件里添加了一行“++++”,而C2在master分支下在文件的第二行添加了一行“———”,C3在beta分支下在文件第二行添加了一行“****”。
- 合并的时候,因为两个分支在同一个文件下的同一个地方都有修改,git无法替人做觉得哪些需要保留或者删除,这时候会同时保留下来,让人自己去选择如何处理。
- 人为处理之后commit形成了C4,完成了分支合并。