繁体   English   中英

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

[英]Git - how to force merge conflict and manual merge on selected file

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

我搜索了一个答案:

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

编辑:变体 4. 描述

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

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

#!/bin/bash
git merge-file "${1}" "${2}" "${3}"
exit 1

这只是执行 Git 本身通常执行的默认合并行为。 关键区别在于脚本总是返回非零值(表示存在冲突,即使合并实际上是在没有冲突的情况下解决的)。

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

[merge "verify"]
        name = merge and verify driver
        driver = ./merge-and-verify-driver %A %O %B

在此示例中,我将merge-and-verify-driver放在 repo 的顶级目录 ( ./ ) 中。 您需要相应地指定脚本的路径。

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

*.sensitive merge=verify

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

这两个命令似乎与使用自定义合并驱动程序具有相同的效果:

git merge --no-commit your_target_branch
git checkout --conflict merge .   (do not forget the . and run it in the top dir of the repository)

第一个命令在创建合并提交之前停止合并,第二个命令将两个分支中修改的所有文件标记为冲突以解决,即使最初没有冲突。

注意:本文“ 为 PO 文件编写 git 合并驱动程序”说明了手动合并文件时可以执行的操作:您可以对其进行预处理,以便手动合并准备好某些数据。

例如,可以使用git merge-file在合并之前解密(并重新加密)文件(!)

在您的情况下,以非 0 状态退出合并驱动程序可确保合并将是手动合并。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM