如何在GIT上进行三方合并,且非冲突合并?

5

如何在 GIT 中禁用自动合并?

目的是在命令链调用期间,对于自动合并的冲突解决与冲突合并具有相同的行为:

$ git fetch
$ git merge some_branch
$ git mergetool

如果合并时没有冲突,最后一条命令将引导我们进行三方文件合并。我希望有一种简单的方法在无冲突合并的情况下执行相同的三方合并。

我在Internet上找不到任何解决方案,有吗?

我有一些解决方法,但宁愿避免使用它们。

提前感谢您的帮助,

Aleks

2个回答

6
对于仅在单侧进行更改的情况,您可以通过取消设置merge属性(请参见“执行三方合并”下的gitattributes)来防止自动合并。对于缺少合并属性(或将其设置为“binary”)的路径名所进行的合并将使当前分支中的版本保留在工作树中,并将路径名的索引条目保留在冲突状态。

如果您希望鼓励每个人都按照这种方式工作,可以将其放入.gitattributes文件中并提交。如果您只想为自己这样做,可以将其放入未提交的.gitattributes文件中,或将其放入存储库的$GIT_DIR/info/attributes文件中(您可以随意添加/删除/重命名以启用/禁用属性)。

#    repository/.git/info/attributes
# OR
#    .gitattributes
* -merge

如果在两侧进行了相同的更改,即使采用此配置,也不会导致冲突。


谢谢Chris,这正是我要找的。不过,我的团队中有一些人和我一样在寻找解决方案,他们说,在合并期间提供此类选项(例如git-merge中-s的一个值)会很好。这背后的理由是man git-merge是大多数人搜索此选项的首选地点。祝好 - Aleks Wrotor
你知道在配置了 * -merge 后,有没有一种按需自动合并的方法吗? - user2427
@damian:对于纯交互式使用,只需暂时注释掉您的 * -merge 行并使用 git checkout -m -- path/to/file。如果您想要脚本化的方式,您将需要使用 git merge-index git-merge-one-file -- path/to/file,或者自己调用 git merge-file - Chris Johnsen

5

诀窍在于,Git解决合并的方法是:

  • 始终基于三方合并(因为提交图可以很容易地获得共同祖先)
  • 除了冲突(此时过程由您协助处理)外,始终无缝

因此,即使定义了合并驱动程序,除非出现某种冲突,否则它不会启动。


首先尝试的设置是定义一个合并属性未设置(Unset)

未设置

将当前分支的版本作为初步合并结果,并声明合并存在冲突。这适用于没有明确定义的合并语义的二进制文件。

您需要在.gitattributes文件中编写。

 * -merge

请检查是否足以触发所有合并文件上的合并工具。


这个“未设置(unset)”功能不是 git merge 直接提供的选项,原因如下:

  • 合并是分布式版本控制系统的主要特性
  • 合并是在树形结构上完成的(考虑整个项目)

试图在文件级别上取消三方合并并不属于合并过程的一部分(再次强调,合并是在树形结构上进行的)。
因此,更适合作为一个属性,可以针对特定的一组文件进行设置。


3
哦,实际上你不需要写“merge=Unset”。Unset是一种状态,“Unset”的语法是“-merge”。手册页面顶部解释了状态和语法的区别(尽管不太容易浏览)。 - Chris Johnsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接