你可以使用命令行方法接受合并代码和 HEAD 冲突代码吗

Can you use the command line method to accept merged code AND HEAD conflict code

我在合并过程中遇到了冲突。该文件包含一些代码已经正确合并的区域,以及一个可以在 HEAD(我们的)和正在合并的分支(他们的)之间进行选择的区域。我想接受成功合并的区域 AND 冲突的 HEAD 部分。

可以在命令行上完成吗?

如果我这样做

git merge -s ours incomingbranch

它似乎没有合并文件。它只是用当前分支的(我们的)版本替换文件。

如果我这样做

git merge incomingbranch
git checkout --ours path/to/conflict/file

它似乎也用当前分支的(我们的)版本替换了文件。

我想要的是自动修复冲突区域并保留合并部分的东西。

显然,最简单的方法是

git merge incomingbranch
(edit the conflictedfile and remove the relevant conflict chunks)
git add conflictedfile
git commit -m "fixed"

但我正在寻找一个命令行选项来最好为单个文件执行此操作。

Git 的选项在这里有点混乱。

Git 合并的 -s 标志设置了 合并策略 。该策略负责获取所有要合并的提交并确定如何合并它们:从哪些提交中使用哪些文件,如何组合它们的内容,等等。在实际情况下,用户应该选择的策略基本上只有两种:-s ours,正如您所发现的,这意味着 完全忽略其他提交,以及默认的 [=12] =],这就是你想要的不同行为。1

但是除了-s标志之外,还有一个-X标志。 Git 调用 -X "strategy options" 的参数(见 the git merge documentation),但我喜欢称它们为 eXtended options,两者都是因为里面有字母 X,因为它们作为策略的扩展 。所以你可能想要的是-X ours。这和-s ours很不一样!你还在使用 -s recursive,你只是告诉递归策略,在发生冲突的情况下,它应该自动选择 HEAD 端。

这不是您想要的,因为:

preferably for individual files

... -X ours 适用于 所有 文件级合并冲突。2

为了得到你想要的,你需要允许合并冲突发生,然后:

  1. 使用三个暂存槽中的文件的三个副本将该文件的所有三个输入提取到工作树中,以便您可以查看和处理它们。

  2. 运行 git merge-file 在三个文件上,带有 --ours 选项。

  3. 将已解析的文件放在适当的位置并使用 git add 将其复制到索引暂存槽零中,清除您在步骤 1 中使用的槽 1-3 中的三个副本.

要完全理解第 1 步,请参阅其他 SO 帖子(我现在没有时间找到)并考虑使用 git checkout-index --stage=all。有关详细信息,请参阅 the git checkout-index documentation


1还有第三种策略,-s resolve,它在有多个合并基础时表现不同。普通用户从来不需要 -s resolve。当您合并两个以上的提交时,Git 会单独使用 octopus 策略。专家 Git 用户可能会使用章鱼策略,但是当他们 运行 正确的 git merge 类型时会自动发生,所以他们并不真的需要 -s 选项.

2我把形容词file-level放在这里是因为这些是low-level, 单文件内冲突。 Git 也有 high-level 冲突,例如,合并的一方修改或重命名文件,而另一方只是 删除 整个文件。 -s resolve 的扩展选项永远不会解决任何高级冲突;它们只会影响这些低级别的冲突。