`
songkang666
  • 浏览: 103073 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Git step by step 10 之merge

    博客分类:
  • GIT
 
阅读更多
        总的来讲,git merge是对分支进行操作的,将两个分支进行合并。

先上图1:

对图1的解释:
        首先是进行了两次提交commit 1和commit 2,此时,发现问题(假设为1号问题),故建立分支issue 1。此时有了issue 1分支,在此分支下可以进行解决1号问题。
        然而,在解决1号问题时突然发现,项目需要添加一个重要的文件,需要切换到master分支,并新建hotfix分支以完成这个添加的动作(当然,也可以直接在master分支下进行添加,但若需要进行恢复,新建hotfix分支的方式似乎使得这个操作更容易些),即做“commit 3”这个提交。
        在hotfix分支下,添加了文件之后,我们需要继续切换回issue1分支以解决1号问题。即做“commit 3’”和“commit 4’”这两个提交。

一、快进(Fast Forward)
        当前分支合并到另一分支时,如果没有分歧解决,就会直接移动文件指针。这个过程叫做fast forward。 举例来说,开发一直在master分支进行,但忽然有一个新的想法,于是新建了一个develop的分支,并在其上进行一系列提交,完成时,回到 master分支,此时,master分支在创建develop分支之后并未产生任何新的commit。此时的合并就叫fast forward。

        在最开始的图1中,将hotfix合并到master(即,使得master与hotfix同指向),即为fast forward,运行以下命令:
git checkout master
git merge hotfix

如图2:

你还可以用git branch -d hotfix 把 hotfix 分支删除。

        示例: 1. 新建一个work tree,在master中做几次commit 2. 新建develop的branch,然后再做多次commits 此时的分支流图如图3(gitx):

        正常合并
(master)$ git merge develop
Updating 5999848..7355122
Fast-forward
c.txt | 1 +
d.txt | 1 +
2 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 c.txt
create mode 100644 d.txt
图4
        可以看出这是一次fast-forward式的合并,且合并完之后的视图为扁平状,看不出develop分支开发的任何信息。

使用–no-ff进行合并
—no-ff (no fast foward),使得每一次的合并都创建一个新的commit记录。即使这个commit只是fast-foward,用来避免丢失信息。
(master)$ git merge –no-ff develop
Merge made by recursive.
c.txt | 2 +-
d.txt | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
图5

        可以看出,使用no-ff后,会多生成一个commit 记录,并强制保留develop分支的开发记录(而fast-forward的话则是直接合并,看不出之前Branch的任何记录)。这对于以后代码进行分析特别有用。

二、基本合并
        在问题1解决之后,可以合并回master分支,实际操作同前面的hotfix分支差不多,只需检出想要更新的分支(master),并运行git merge命令指定来源:
git checkout master
git merge issue1

        请注意,这次合并的实现,并不同于前面hotfix 的并入方式。这一次,Git 会用两个分支的末端commit 3 和 commit 4’和它们的共同祖先 commit 2 进行一次简单的三方合并计算。然后,Git对三方合并的结果作一新的快照,并自动创建一个指向它的 commit 5(见图6)。


Ps: Git 可以自己裁决哪个commit 是他们最佳的合并基础(这里是commit 2,也就是分叉的地方)。


三、带冲突的合并
        如果你在两个分支中都修改了同一个文件的同一部分,合并时就会出现冲突,Git就无法自动将两者合在一起,只能由人来解决。
        依旧用我们的图2,假设在commit 2时,创建了一文件test.txt,而在commit 3及commit 3’中都进行了对test.txt的第一行进行了操作,那么在进行git merge issue1时,会提示有冲突:
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
        当输入git log --all --graph --oneline,你会发现,并没有创建新的commit(区别于上一部分的“基本合并”,由于其成功合并,会创建一个新的commit),而在工作目录中的test.txt文件里,包含冲突部分及提示,此时需要你手工地进行修改(vi test.txt),然后git add test.txt以及 git commit -m "merge XXXX",即可,图示同图6.

more:
Git 101 – Fast Forward
《pro git》
《Git Community Book 中文版》 分支与合并@基础
  • 大小: 10 KB
  • 大小: 10.4 KB
  • 大小: 10.9 KB
分享到:
评论
1 楼 cuqing 2016-03-28  
分析得简明易懂,推荐阅读。

相关推荐

Global site tag (gtag.js) - Google Analytics