2012-03-22 4492 views
97

我在git rebasing,和我得到的一个冲突是'两个添加' - 也就是说,完全相同的文件名已分别添加到我的分支,并在我分手的分支。 git status告诉我:在git中解决'both added'合并冲突?

# 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如何知道我想删除哪个文件版本以及我想保留哪个版本?

回答

97

如果您使用git rm,git会从索引中删除该路径的所有版本,所以您的解决方案操作将使您没有任何版本。

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

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

+1

谢谢。我刚刚意识到合并工具不工作的原因是因为git为合并创建.LOCAL和.REMOTE文件,但不是.BASE文件。我认为它应该只是创建一个空的.BASE文件。如果您手动创建空的.BASE文件,合并工具正常工作。 – Jez 2012-03-22 14:29:40

+1

@Jez:请参阅此主题:http://thread.gmane.org/gmane.comp.version-control.git/188776/focus=188867 – 2012-03-22 14:57:57

+1

那么你是说这将在最近版本的git中修复? – Jez 2012-03-22 16:01:37

51

我有时会发现使用--theirs--ours选项来识别文件来自哪里,这会让人感到困惑。大多数时候我的矿工将在--theirs提及的分支中。

您还可以使用git checkout <tree-ish> -- src/MyFile.cs

<tree-ish>可以通过分支机构的名称进行替换或承诺-ID,其中包含你想保留的文件。

git checkout 6a363d8 -- src/MyFile.cs

git checkout my_branch -- src/MyFile.cs

git checkout HEAD -- src/MyFile.cs

26

做当...

git checkout --ours someFile

它可能看起来像它这样做的git状态时,什么也没做。

只需记住这样做之后。

git add someFile 
git status