一文彻底搞懂 git merge

简介: 考虑下面的情况:![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/3edfb5df-9a6f-49c5-b615-f51287fffe7c.png)`A 1:1 2:2`代表`节点A`包含两个文件,`文件1`的内容是`1`,`文件2`的内容是`2`。`B`、`C`节点分别做了修改,现在需要合并,把`C`m

考虑下面的情况:

A 1:1 2:2代表节点A包含两个文件,文件1的内容是1文件2的内容是2

BC节点分别做了修改,现在需要合并,把Cmerge到B,结果会是什么样的呢?

根据三路合并的原理,首先找CB的公共祖先,然后对比文件。CB的公共祖先是A,三路合并表如下:

ancestor(A) theirs(C) ours(B)
1:1 1:8 1:6
2:2 2:24 2:2

根据上表,文件1 theirs 和 ours 都有修改,需要解决冲突;文件2 ours 和 ancestor 一致,theirs做了修改,以theirs为准,merge结果为24

结果如下:

现在假设merge时误操作,在解决文件1冲突的时候,手动将文件2修改为了2文件1解决完冲突,内容为8

误操作后,结果如下:

为了修复误操作,将文件2修复成24,一个比较直观的想法是先revertD,然后重新merge。

使用命令git revert D -m 1revertD并恢复到B,然后重新merge:

结果mergeC^D时,git返回Already up to date,什么都没做。这是为什么呢?

这是因为C^D的公共祖先为C,merge时会像这样三路合并:

ancestor(C) theirs(C) ours(^D)
1:8 1:8 1:6
2:24 2:24 2:2

根据上面的表格,git发现,theirs没有修改,ours修改了,以ours为准,因此文件1内容仍为6文件2内容仍为24,这次merge操作,并不会生成E节点。

如果从B拉一个新分支,重新mergeC,生成F,会怎么样呢?我们操作一下:

现在F上是正确的内容(2:24),此时如果再将Fmerge到^D上,生成GG的内容会是什么呢?

首先看F^D的公共祖先,有BC两个。

使用命令git merge-base -a B C,结果显示确实有B和C两个最佳公共祖先。

有两个最佳公共祖先时怎么处理?git-mergeman-page的章节MERGE STRATEGIES有介绍:

When there is more than one common ancestor that can be used for 3-way merge, it creates a merged tree of the common ancestors and uses that as the reference tree for the 3-way merge.

git首先会做BC的merge。BC的公共祖先是A,三路合并表如下:

ancestor(A) theirs(C) ours(B)
1:1 1:8 1:6
2:2 2:24 2:2

结果为文件1有冲突,文件2内容为24

这个结果再作为base,参与F^D的合并:

base theirs(F) ours(^D)
1:6?8?有冲突 1:8 1:6
2:24 2:24 2:2

结果为:文件1需要解冲突,文件2内容为2

目录
相关文章
|
8月前
|
开发工具 git
git merge和git rebase异同
git merge和git rebase异同
190 0
|
7月前
|
开发工具 git 开发者
【git merge/rebase】详解合并代码、解决冲突
【git merge/rebase】详解合并代码、解决冲突
752 0
|
5月前
|
开发工具 git 开发者
|
7月前
|
安全 开发工具 git
蓝易云 - git rebase和merge区别
在选择使用Merge还是Rebase时,需要根据具体的工作流程和团队的规定来决定。一般来说,如果你想保持完整的历史记录并且避免可能的冲突,你应该使用Merge。如果你想要一个干净的、线性的历史记录,你可以使用Rebase。
71 4
|
6月前
|
开发工具 git 开发者
git IDEA的分支合并时的冲突问题总结,merge和rebase的区别
冲突的处理需要开发者之间的充分沟通以及对项目历史的细致理解。选择Merge或Rebase取决于具体的工作流程和团队偏好,但最重要的是保持代码库的整洁与一致性。使用IDEA等工具可以提高处理合并冲突的效率,但手动解析冲突和理解操作背后的逻辑仍然是不可或缺的。最终目标是通过有效的版本控制实践,促进项目的顺利进行和团队协作的高效。
427 0
|
8月前
|
开发工具 git
避免git产生Merge branch 'foo' into 'bar'提交
避免git产生Merge branch 'foo' into 'bar'提交
113 3
|
Ubuntu Linux 开发工具
idea使用git提交代码报异常refusing to merge unrelated histories和unknown option `allow-unrelated-histories‘
idea使用git提交代码报异常refusing to merge unrelated histories和unknown option `allow-unrelated-histories‘
|
8月前
|
开发工具 git
git 拉取代码仓库代码报错(合并错误 refusing to merge unrelated histories)
git 拉取代码仓库代码报错(合并错误 refusing to merge unrelated histories)
107 0
|
8月前
|
开发工具 git
百度搜索:蓝易云【git常用命令之Merge】
请注意,合并过程中可能会出现冲突,需要手动解决冲突后再进行提交。合并操作应谨慎执行,特别是在重要的项目中,应先进行代码审查或测试,确保合并不会引入错误或不稳定的代码。
213 4
|
8月前
|
前端开发 开发工具 git
git rebase 和 git merge的区别?以及你对它们的理解?
git rebase 和 git merge的区别?以及你对它们的理解?
116 1

相关实验场景

更多