git 中的 merge 类型

1. 2-way merge 和 3-way merge 

作者:Lazykid
链接:https://www.zhihu.com/question/30200228/answer/866309494
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Three-way merge 是因为有a b, c三个节点。如果只提供a,b, 就是two-way merge.

Three-way merge的好处是程序能理解你到底做了哪些改动,如果这些改动没有冲突,则它会自动帮你合并。 Two-way merge说白了就是一个diff, 程序永远不能帮你自动merge, 需要人工干预。

举个例子, 假设有一个文本文件,A和B同时做了改动, a,b 节点如下

现在问题来了,merge的结果应该是怎样的? 条件不足,无法判断。

如果现在告诉它们的共同祖先c,进行three-way merge:

通过base/src的对比,我们知道A的改动是删除了3; 通过base/dst的对比,我们知道B的改动是增加了1,所以merge结果是:

类似的,如果原来的c节点是这样的:

则通过base/src对比,我们知道A的操作是删除了1; 通过base/dst的对比,我们知道B的操作是增加了3。则merge的结果应该是:

由此可见,如果只有节点a和b,进行two-way merge,其实是无法确定到底做了什么改动,merge的结果应该是怎样的,必须由用户自己解决。如果有a/b的共同祖先c的信息,three-way merge 能通过对比知道用户做了哪些增删改操作,并尝试自动merge结果.

 

2. fast-forward merge

How a Git merge fast forward happens

When Git detects that your commit is about to be merged into your project's main branch without the main branch having been modified since your feature branch was first made, it chooses to use a fast-forward merge instead of a three-way merge. Fast-forward merges literally move your main branch's tip forward to the end of your feature branch. This keeps all commits created in your feature branch sequential while integrating it neatly back into your main branch.

来源:https://blog.mergify.com/what-is-a-git-merge-fast-forward/

总的来说,当一个feature-branch已经修改完毕,而 master-branch尚无任何改动,就会发生 fast foward merge。(直接把 feature branch 的末端作为新的 master branch)

 

posted @ 2022-09-24 14:49  yinhuachen  阅读(97)  评论(0编辑  收藏  举报