我想知道您如何在Git中处理这样的情况:
Git告诉我的是:
CONFLICT (rename/rename): Rename "foo.c"->"bar.c" in branch "HEAD" rename "foo.c"->"moo.c" in "task001"
Automatic merge failed; fix conflicts and then commit the result.
我该怎么解决?我的意思是,名称冲突解决后,我仍然想 merge 两个文件。
谢谢。
最佳答案
最初,我理解您的问题的含义与您在注释中澄清的含义有所不同,但是原始答案可能会有用,因此我将其作为第一部分,但在下面添加一个替代方案:
1.只是解决了冲突,所以只有moo.c和bar.c不同
在这里,我假设您想要的结果是在 merge 版本中具有bar.c
和moo.c
,以及每个分支的更改。我将通过解决索引中的冲突并提交来解决这个问题。您描述的情况如下所示:
$ git log --pretty=oneline --graph --decorate master task001
* fce127471ab5d1ef55b1d16412a75a7129782517 (task001) Rename to a different file on task001
* 8edbc1357a3c0484dc077f6f7ce43de91d21e794 A small change on the task001 branch
| * d10e9020d147a4bbd3688744823380322bf37718 (HEAD, master) Rename on master to bar.c
| * f952617645456a551df07f219bfdc95e00c8ac9b Added a small change in master
|/
* e8602eef46af744defd4fb4073ecdb6a7afbfd28 Initial version of foo.c
如果然后将
task001
merge 为master
,则会产生与您看到的相同的错误:$ git merge task001
CONFLICT (rename/rename): Rename "foo.c"->"bar.c" in branch "HEAD" rename "foo.c"->"moo.c" in "task001"
Automatic merge failed; fix conflicts and then commit the result.
然后
git status
将向您显示问题的摘要:$ git status
# On branch master
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# added by us: bar.c
# both deleted: foo.c
# added by them: moo.c
#
no changes added to commit (use "git add" and/or "git commit -a")
现在,您只需要使用
git add
和git rm
即可解决冲突:$ git add bar.c
$ git rm --cached foo.c
foo.c: needs merge
moo.c: needs merge
rm 'foo.c'
$ git add moo.c
$ git status
# On branch master
# Changes to be committed:
#
# new file: moo.c
#
(我使用
--cached
删除了foo.c
,因为它不再存在于工作副本中,并且--cached
意味着该命令仅查看索引-否则您会收到关于foo.c
不存在的错误。)然后,您只需提交结果:
$ git commit
[ save the prepopulated commit message ]
您已经解决了冲突,并在 merge 版本中包含了
bar.c
和moo.c
。(我注意到,在这里描述的简单示例情况下,
git merge -s resolve
对我有用,但我希望这在总体上更有用。)2.将bar.c和moo.c merge 回一个文件
从下面的评论看来,您真正想要的是将这些文件再次 merge 为一个, merge 两个分支中文件的更改。如果您希望git的 merge 策略来帮助您解决此问题,则在 merge 之前,每个分支上的文件必须具有相同的路径,因此在 merge 之前,您需要至少重命名其中的一个。假设您希望将 merge 后的文件称为
quux.c
,尽管当然也可以再次将其命名为foo.c
。然后,您可以执行以下步骤,在 merge 之前重命名每个分支上的文件:# Rename the file on master:
$ git checkout master
Already on 'master'
$ git mv bar.c quux.c
$ git commit -m "Rename bar.c to quux.c on branch master"
[master f9b3f49] Rename bar.c to quux.c on branch master
1 files changed, 0 insertions(+), 0 deletions(-)
rename bar.c => quux.c (100%)
# Rename the file on task001:
$ git checkout task001
Switched to branch 'task001'
$ git mv moo.c quux.c
$ git commit -m "Rename moo.c to quux.c as well on branch task001"
[task001 c71ad89] Rename moo.c to quux.c as well on branch task001
1 files changed, 0 insertions(+), 0 deletions(-)
rename moo.c => quux.c (100%)
# Switch back to master, and merge in task001:
$ git checkout master
Switched to branch 'master'
$ git merge task001
如果更改没有冲突,则此时 merge 应该可以正常工作。在示例中,我尝试了它们确实存在冲突,因此我需要编辑文件,对文件进行
git add
并提交结果:Renaming foo.c->quux.c
Auto-merging quux.c
CONFLICT (content): merge conflict in quux.c
Automatic merge failed; fix conflicts and then commit the result.
$ emacs -nw quux.c
$ git add quux.c
$ git commit
[master 8baa7cb] Merge branch 'task001'
$ ls
quux.c
关于git divergent重命名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4679901/