如何在非冲突合并中获得GIT的3向合并?

时间:2010-06-25 23:23:44

标签: git version-control merge kdiff3

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

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

$ git fetch
$ git merge some_branch
$ git mergetool

最后一个命令会导致我们在合并冲突的情况下进行文件的3向合并。我希望有一种简单的方法可以在没有冲突合并的情况下对文件执行相同的3向合并。

我在互联网上找不到任何解决方案,有没有?

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

提前致谢,

阿莱克斯

2 个答案:

答案 0 :(得分:6)

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

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

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

如果双方都进行了相同的更改,即使这种配置也不会引起冲突。

答案 1 :(得分:5)

诀窍是,the way git solves merges是:

  • 总是基于3向合并(因为提交图允许非常容易地获得共同的祖先)
  • 总是无缝地除了冲突(过程得到你的帮助)

因此,即使您定义了merge driver,除非存在某种冲突,否则它不会启动。


要尝试的第一个设置是定义merge attribute Unset

  

取消设置

     

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

您可以使用.gitattributes文件

进行撰写
 * -merge

,看看是否足以在所有合并文件上触发mergetool。


这种“未设置”功能不能直接作为git merge的选项的一个原因是:

尝试在文件级别取消设置3向合并不是合并过程的一部分(再次,在树级别的原因)。
因此它更适合作为可以为特定文件集设置的属性。