解决 git 中的“都添加”合并冲突?

Posted

技术标签:

【中文标题】解决 git 中的“都添加”合并冲突?【英文标题】:Resolving a 'both added' merge conflict in git? 【发布时间】:2012-04-07 02:20:37 【问题描述】:

我在 git 中进行变基,我得到的一个冲突是“都添加” - 也就是说,完全相同的文件名已独立添加到我的分支中,并且在我正在变基的分支中。 git status 告诉我:

# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       both added:         src/MyFile.cs

我的问题是,我该如何解决这个问题?我必须使用合并工具还是有一种方法可以仅从命令行执行?如果我git rm src/MyFile.cs,git如何知道我要删除哪个文件版本以及我要保留哪个文件版本?

【问题讨论】:

【参考方案1】:

如果您使用git rm git 将从索引中删除该路径的所有版本,因此您的解析操作将使您没有任何版本。

您可以使用git checkout --ours src/MyFile.cs 从您要变基的分支中选择版本,或使用git checkout --theirs src/MyFile.cs 从您要变基的分支中选择版本。

如果您想要混合,则需要使用合并工具或手动编辑。

【讨论】:

谢谢。而且我刚刚意识到合并工具不起作用的原因是因为 git 为合并创建了 .LOCAL 和 .REMOTE 文件,而不是 .BASE 文件。我认为它应该只创建一个空的 .BASE 文件。如果您手动创建空的 .BASE 文件,则合并工具可以正常工作。 @Jez:请看这个帖子:thread.gmane.org/gmane.comp.version-control.git/188776/… 那么你是说这会在最新版本的 git 中修复? @Jez:在 git 版本中 >= 1.7.9.1 git.kernel.org/?p=git/… 来自@Tom 的回答:当做...git checkout --ours someFile 看起来它在做 git status 时似乎没有做任何事情。 请记住之后再做。 git add someFilegit status【参考方案2】:

我有时会发现使用--theirs--ours 选项来识别文件的来源会让人感到困惑。大多数时候我的将在我正在重新定位的分支中,--theirs!

你也可以使用git checkout &lt;tree-ish&gt; -- src/MyFile.cs

&lt;tree-ish&gt; 可以替换为包含您希望保留的文件的分支名称或提交 ID。

git checkout 6a363d8 -- src/MyFile.cs

git checkout my_branch -- src/MyFile.cs

git checkout HEAD -- src/MyFile.cs

【讨论】:

我无法强调理解这一点的精确性和重要性。我们的和他们的只是隐藏了你真正想要的东西,那就是在添加两者时指出你想要使用哪个文件作为分辨率。【参考方案3】:

当做...

git checkout --ours someFile

在做 git status 的时候好像什么都没做。

请记住之后再执行此操作。

git add someFile
git status

【讨论】:

以上是关于解决 git 中的“都添加”合并冲突?的主要内容,如果未能解决你的问题,请参考以下文章

git之解决合并中的冲突(收集)

用于解决 git 中的合并冲突的控制台 UI 工具......就像 vimdiff 但“更容易”

git合并分支冲突解决

idea解决代码冲突

给定合并提交 SHA1,您如何查看/显示已完成的 git 合并冲突解决?

Git 合并冲突之后怎么办?