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

Git-如何在选定文件上强制合并冲突和手动合并,git,merge,branch,conflict,manual,Git,Merge,Branch,Conflict,Manual,我们维护的web应用程序具有公共主分支和许多并行分支,每个安装一个分支,每个分支很少有特定的更改。源代码是在git中管理的,当我们需要将特性和错误修复从主分支转移到并行分支时,它是一个很棒的工具。但是很少有文件是敏感的,自动合并通常会产生不好的结果。因此,如果能够以某种方式标记它们,合并就会容易得多,并且每次合并都会导致冲突,需要手动合并 我寻找答案: 我正在使用--no commit和--no ff合并选项,但这两个选项不同 有人问了同样的问题,但没有解决办法 类似的情况似乎是使用.gittr

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

我寻找答案:

  • 我正在使用--no commit--no ff合并选项,但这两个选项不同
  • 有人问了同样的问题,但没有解决办法
  • 类似的情况似乎是使用.gittributes,其中包含:somefile.php merge=ours。我试图找到一些会产生冲突或强制手动合并的合并选项,但到目前为止没有找到
  • .git包含以下内容的属性:somefile.php-merge不会自动合并,因此会强制手动合并。这是90%的解决方案,但我所寻求的是尝试自动合并,并将其标记为冲突,无论是否成功但这离解决方案最近。(…感谢查尔斯·贝利的澄清…)
  • 有人建议编写自定义合并驱动程序(,),但我还不清楚如何编写
    编辑:变体4。说明

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

    首先,创建一个名为
    合并并验证驱动程序的合并驱动程序脚本。使它可执行并把它放在一个合适的位置(你可能想考虑把这个脚本检查到回购中,甚至,因为回购协议的配置文件将取决于它)。Git将执行此shell脚本以合并敏感文件:

    #!/bin/bash
    git merge-file "${1}" "${2}" "${3}"
    exit 1
    
    这只是执行Git本身通常执行的默认合并行为。关键的区别在于脚本总是返回非零(以指示存在冲突,即使合并实际上是在没有冲突的情况下解决的)

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

    在本例中,我将
    合并并验证驱动程序
    放在repo的顶级目录(
    /
    )中。您需要相应地指定脚本的路径

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

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

    注意:本文“”说明了手动合并文件时可以执行的操作类型:您可以对其进行预处理,以便手动合并准备好某些数据

    例如,可以用于(!)


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

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

    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)
    

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

    这不是您要寻找的确切答案,但出于同样的原因,我先执行
    git fetch
    ,然后使用
    git difftool FETCH_HEAD
    ,这样我就可以手动将远程分支中的更改应用到local.MHC:这是一个很好的技巧(特别是如果为每个并行分支保存脚本+并防止文件自动合并)。主要缺点是,在团队工作流中,可能有人忘记了这一步骤,而只是进行正常合并。设置
    -merge
    不会阻止您合并文件,它只是强制您手动执行,例如使用合并工具。这不是你需要的吗?这是我想要的90%。我希望合并是自动完成的,但是对于这个敏感文件,合并被认为是冲突的,即使没有冲突,所以每次都强制手动检查。@Stepan我处于类似的情况,所以我想澄清一些事情。您所说的使用
    -merge
    中的
    .gitatttributes
    git merge
    什么都不做,所有工作都必须使用合并工具完成?所以合并工具不需要使用,对吗?Dan的解决方案确实提供了这一点?非常感谢您提供这一详细的指南!似乎在“明显的”解决方案中没有调用合并驱动程序。例如,如果文件仅在一个分支上更改,并且您进行了合并,则“敏感”文件将被覆盖,并且不会调用合并驱动程序。有没有办法解决这个问题?这真的会像@VitalyB建议的那样吗?谢谢这是可行的,但是有没有办法使它成为机器上所有存储库的全局选项?还有,有没有办法通过命令行调用它?我希望有一种简单的方法可以做到这一点,比如在命令行上更改合并策略。添加到@VitalyB comment。如果两个分支对文件进行了相同的更改,则合并也不会出现。例如,两个分支都将版本增加了1,您希望在尝试合并时增加2。。。非常实际的问题,尚未解决。:(您能否详细说明“PO文件合并驱动程序”链接,因为这似乎会导致我拒绝访问?我希望它能为工作中被阻止的问题@MikkoRantalainen提供答案,所以我今晚将在家里尝试使用“PO文件合并驱动程序”
    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)