Git - 如何在所选文件上强制合并冲突和手动合并

Ste*_*pan 79 git merge branch conflict manual

我们维护具有通用主分支和多个并行分支的Web应用程序,每个安装一个,每个都没有特定的更改.源代码在git中管理,当我们需要从主分支到并行分支的传输功能和错误修正时,它是非常好的工具.但是很少有敏感的文件和自动合并通常会产生不好的结果.因此,如果它们可以某种方式标记并且每次合并都会导致需要手动合并的冲突,那么合并会更容易.

我搜索了一个答案:

  1. 我使用--no-commit--no-ff合并选项,但它不一样.
  2. 这里这里有人问同样的问题,但没有解决方案.
  3. 类似的情况似乎是如何防止文件被合并使用.gitattributes包含:somefile.php merge = ours.我试图找到一些合并选项,它会产生冲突或强制手动合并但到目前为止没有找到.
  4. .gitattributes包含:somefile.php -merge永远不会自动合并,因此强制手动合并.它是90%的解决方案,但我所寻求的是尝试自动合并并将其标记为冲突,无论它是否成功.但这是迄今为止最接近解决方案的. (...感谢Charles Bailey的澄清......)
  5. 有人建议编写自定义合并驱动程序(1,2),但如何做到这一点还远未清晰.

编辑:变种4.描述

Dan*_*ing 57

选项5,自定义合并驱动程序,可能是最接近您想要的方式.这很容易做到.下面是一个我认为应该让你非常接近你想要的行为的例子.

首先,创建一个名为合并驱动程序的脚本merge-and-verify-driver.使其可执行并将其放在合适的位置(您可能需要考虑将此脚本检入到repo中,因为repo的配置文件将取决于它).Git将执行此shell脚本来执行敏感文件的合并:

#!/bin/bash
git merge-file "${1}" "${2}" "${3}"
exit 1
Run Code Online (Sandbox Code Playgroud)

这只是Git本身通常执行的默认合并行为.关键区别在于脚本始终返回非零(表示存在冲突,即使实际已解决合并而没有冲突).

接下来,您需要告诉Git您的自定义合并驱动程序是否存在.你在repo的配置文件(.git/config)中执行此操作:

[merge "verify"]
        name = merge and verify driver
        driver = ./merge-and-verify-driver %A %O %B
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我已经放入merge-and-verify-driver了repo的顶级目录(./).您需要相应地指定脚本的路径.

现在,您只需要为敏感文件提供适当的属性,以便在合并这些文件时使用自定义合并驱动程序.将其添加到您的.gitattributes文件中:

*.sensitive merge=verify
Run Code Online (Sandbox Code Playgroud)

在这里,我告诉Git,任何名称与模式匹配的文件*.sensitive都应该使用自定义合并驱动程序.显然,您需要使用适合您的文件的模式.

  • 似乎合并驱动程序不是在"明显"的解决方案中调用的.例如,如果文件仅在一个分支上更改并且您进行了合并,则"敏感"文件将被覆盖,并且不会调用合并驱动程序.有办法解决这个问题吗? (13认同)
  • 添加到@VitalyB评论.如果_both_ branches对文件进行了相同的更改,则也不会出现合并.例如,两个分支都将版本增加了1,并且您希望在尝试合并时增加2 ...非常实际的问题,尚未解决.:( (4认同)