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。

  1. C1在文件里添加了一行“++++”,而C2在master分支下在文件的第二行添加了一行“———”,C3在beta分支下在文件第二行添加了一行“****”。
  2. 合并的时候,因为两个分支在同一个文件下的同一个地方都有修改,git无法替人做觉得哪些需要保留或者删除,这时候会同时保留下来,让人自己去选择如何处理。
  3. 人为处理之后commit形成了C4,完成了分支合并。

参考文献:https://www.progit.cn/#_分支的新建与合并

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐