合并时发生冲突。该文件包含已正确正确合并的某些区域以及在HEAD(我们的)和要合并的分支(它们的)之间进行选择的区域。我要接受冲突的HEAD部分成功合并的区域 AND 。
可以在命令行上完成吗?
如果我这样做
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"
但是我正在寻找一个命令行选项来最好对单个文件执行此操作。
答案 0 :(得分:1)
Git的选项在这里有点令人困惑。
Git合并的-s
标志设置合并策略。该策略负责获取所有要合并的提交,并弄清楚如何合并它们:要从哪些提交中使用哪些文件,如何合并其内容,等等。在实际情况下,用户基本上只应该选择两种策略:-s ours
(您发现了)意味着完全忽略其他提交,以及默认的-s recursive
,这就是您想要表现不同的方式。 1
但是除了-s
标志之外,还有一个-X
标志。 Git将参数称为-X
的“策略选项”(请参阅the git merge
documentation),但我喜欢将它们称为扩展选项,因为它们中都带有字母X,并且因为它们是该策略的扩展。因此,您可能想在这里-X ours
。这与-s ours
有很大的不同!您仍在使用-s recursive
,您只是在告诉递归策略,如果发生冲突,它应该自动选择HEAD端。
这不是您想要的 ,因为:
最好用于单个文件
... -X ours
适用于所有文件级合并冲突。 2
要获得所需的内容,您需要允许发生合并冲突,然后:
使用三个暂存槽中的文件的三个副本将该文件的所有三个输入提取到工作树中,以便您可以查看和处理它们。
< / li>使用--ours
选项在三个文件上运行git merge-file
。
将已解析的文件放在适当的位置,然后使用git add
将其复制到索引暂存插槽零中,清除掉在步骤1中使用的插槽1-3中的三个副本。
要完全理解第1步,请参阅其他SO帖子(我现在没有时间找到一个),并考虑使用git checkout-index --stage=all
。有关详细信息,请参见the git checkout-index
documentation。
1 还有第三种策略-s resolve
,当存在多个合并库时,该策略的行为会有所不同。普通用户根本不需要-s resolve
。当您合并两个以上提交时,Git有一个自己使用的git merge
时它会自动发生,因此他们实际上并不需要-s
选项。
2 我在这里放入形容词文件级,因为它们是低级,一个文件内的冲突。 Git还具有高级冲突,例如,在合并的一侧修改或重命名文件,而另一侧只是完全删除 时,就会发生冲突。 -s resolve
的扩展选项永远无法解决任何高级冲突;它们只会影响这些低级冲突。