Git:真实merge

概要

Git:真实merge。

博客

原帖收藏于IT老兵驿站

前言

这里准备碎片化地去解读和理解Git的一些功能。关于git-merge的总结一直没有做,但是几乎每天都会遇到git-merge,而且会遇到很多随着merge而产生的问题,所以只好碎片化地去做一做整理。

正文

git-merge有两种merge方式,ff方式和true merge方式,关于ff的方式,另外一篇文章有讲过,这里不再赘述,这里整理一下true merge,真实merge。

介绍

先摘录一段:

TRUE MERGE
Except in a fast-forward merge (see above), the branches to be merged must be tied together by a merge commit that has both of them as its parents.
真实merge是真的去merge一下,而不是像ff那样,只是把一个commit放过来。


A merged version reconciling the changes from all branches to be merged is committed, and your HEAD, index, and working tree are updated to it. It is possible to have modifications in the working tree as long as they do not overlap; the update will preserve them.
一个merge的版本调节了所有要被merge的分支的改变,并且会被提交,这样你的HEAD、index、working tree都会被更新。


When it is not obvious how to reconcile the changes, the following happens:


The HEAD pointer stays the same.


The MERGE_HEAD ref is set to point to the other branch head.


Paths that merged cleanly are updated both in the index file and in your working tree.


For conflicting paths, the index file records up to three versions: stage 1 stores the version from the common ancestor, stage 2 from HEAD, and stage 3 from MERGE_HEAD (you can inspect the stages with git ls-files -u). The working tree files contain the result of the “merge” program; i.e. 3-way merge results with familiar conflict markers <<< === >>>.
3路merge,公共祖先、HEAD、MERGE_HEAD来merge。


No other changes are made. In particular, the local modifications you had before you started merge will stay the same and the index entries for them stay as they were, i.e. matching HEAD.


If you tried a merge which resulted in complex conflicts and want to start over, you can recover with git merge –abort.

这里是三个版本的关系,公共祖先的版本、HEAD(本地仓库的版本)、MERGE_HEAD(另外一个分支想要merge过来的版本),所以叫3-way merge,三路合并。

关于HEAD、index、worktree、local repository、remote repository的关系,请参考这里,这个挺重要,随后要整理一下。

合并策略:

MERGE STRATEGIES


The merge mechanism (git merge and git pull commands) allows the backend merge strategies to be chosen with -s option. Some strategies can also take their own options, which can be passed by giving -X

使用-X<option>参数,可以指定合并策略,上面摘录了两种,一种是resolve,一种是recursive,第一种策略看上去似乎是可以自动解决冲突,第二种是Git默认的merge策略,会产生一些少量的冲突,而不会进行错误的合并,它还有几个选项,就是合并时,只选择本地的(ours),或者只选择别人的(theirs)。

参考

https://git-scm.com/docs/git-merge
https://stackoverflow.com/questions/3689838/whats-the-difference-between-head-working-tree-and-index-in-git