Git step by step 10 之merge

总的来讲,git merge是对分支进行操作的,将两个分支进行合并。

先上图1:
[img]http://dl.iteye.com/upload/attachment/0083/1627/73b79546-a428-3d1c-b269-83c65586a28b.png[/img]
对图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分支,此时,[b]master分支在创建develop分支之后并未产生任何新的commit[/b]。此时的合并就叫fast forward。

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

git checkout master
git merge hotfix

如图2:
[img]http://dl.iteye.com/upload/attachment/0083/1705/834ac5b5-31dd-3fe0-9595-836ed223ff3c.png[/img]
你还可以用git branch -d hotfix 把 hotfix 分支删除。

示例: 1. 新建一个work tree,在master中做几次commit 2. 新建develop的branch,然后再做多次commits 此时的分支流图如图3(gitx):
[img]http://sns.xiaomei.cc/attachment/temp/img/2012/02/34000/33263/img/img_1329193173_1.png[/img]
正常合并
(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
[img]http://sns.xiaomei.cc/attachment/temp/img/2012/02/34000/33263/img/img_1329193176_2.png[/img]图4
可以看出这是一次fast-forward式的合并,且合并完之后的视图为扁平状,看不出develop分支开发的任何信息。

[b]使用–no-ff进行合并[/b]
—no-ff (no fast foward),[b]使得每一次的合并都创建一个新的commit记录。即使这个commit只是fast-foward,用来避免丢失信息。[/b]
(master)$ git merge –no-ff develop
Merge made by recursive.
c.txt | 2 +-
d.txt | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
[img]http://sns.xiaomei.cc/attachment/temp/img/2012/02/34000/33263/img/img_1329193179_3.png[/img]图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)。
[img]http://dl.iteye.com/upload/attachment/0083/1713/c1402b8a-1ccd-34fa-b8c8-f90a7d48b1da.png[/img]

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


三、带冲突的合并
如果你在两个分支中都修改了[b]同一个文件的同一部分[/b],合并时就会出现冲突,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:
[url=http://www.starming.com/index.php?action=plugin&v=wave&tpl=union&ac=viewgrouppost&gid=33263&tid=19628]Git 101 – Fast Forward[/url]
《pro git》
[url=http://gitbook.liuhui998.com/3_3.html]《Git Community Book 中文版》 分支与合并@基础[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值