深入理解和实践git merge.md

2 篇文章 0 订阅

1.git merge的简单理解

看下git merge的命令:

git merge hotfix

例如当前的分支是master,那么这条命令的意思就是,将hofix分支的的修改同步到master分支。

2. git merge 的两种实质操作过程

2.1 结果为“快进”的git merge

我们看一下操作过程:

master分支的指针位于C2的节点,现在master出现了问题,我们从master上切出一个分支命名为hotfix。hotfix分支指针指向新的节点C4.如下图
在这里插入图片描述

中间执行的命令:

git checkout master
git checkout -b hotfix 
vim .... # fixed bug
git commit -a -m 'fixed bug'

经过测试之后hotfix已经解决了bug,现在要将hotfix的修改合并到master:

$ git checkout master
$ git merge hotfix 
Updating f42c576..3a0874c
Fast-forward...

在这里插入图片描述

注意这个词“fast-forward(快进)”。由于当前 master 分支所指向的提交是当前提交(有关 hotfix 的提交)的直接上游,所以 Git 只是简单的将指针向前移动。也就是说当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。

现在你可以把hotfix分支删掉了git branch -d hotfix。

2.2 结果为“合并提交”的merge

在hotfix之前,还一直存一个问题,我们建了一个分支命名为iss53。iss53从C2(之前的master指向的快照)切出,提交了两个commit。现在iss53问题已经解决,需要将这部分的修改合并回master分支。
在这里插入图片描述

执行如下指令:
$ git checkout master
$ git merge iss53
Merge made by the ‘recursive’ strategy…

这种方式和“快进”不同,因为开发历史从一个更早的地方开始分叉开来(diverged)。master 分支所在提交并不是 iss53 分支所在提交的直接祖先。这时Git 会使用两个分支的末端所指的快照(C4 和 C5)以及这两个分支的工作祖先(C2),做一个简单的三方合并。Git 将此次三方合并的结果做了一个新的快照并且自动创建一个新的提交指向它。 这个被称作一次合并提交,它的特别之处在于他有不止一个父提交。
在这里插入图片描述

3.合并时遇到冲突

如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们。 如果你对 #53 问题的修改和有关 hotfix 的修改都涉及到同一个文件的同一处,在合并它们的时候就会产生合并冲突。

不要害怕。此时 Git 做了合并,但是没有自动地创建一个新的合并提交。 Git 会暂停下来,等待你去解决合并产生的冲突。你只需要解决冲突即可。冲突标识很明显,git会用“<<<<<<<” 和“=======”将冲突包裹。

解决冲突之后,可以使用git status查看当前的状态:

$ git status
On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

这时你可以使用 git commit 来完成合并提交。

通过本篇我们加深了对一个知识点的理解——git在进行一些重要操作时,会产生新文件(其中一些是为快照),分支只是一个指针,指向快照。

注:本篇参考Git官方文档-分支的新建与合并

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值