我想知道你如何在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.
我该如何解决?我的意思是,一旦名称冲突得到解决,我仍然希望合并这两个文件。
感谢。
答案 0 :(得分:13)
我最初将您的问题理解为与您在评论中澄清的内容不同,但原始答案可能有用,所以我将其作为第一部分,但在下面添加替代方案:
这里我假设您想要的结果是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
合并到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
表示命令只查看索引 - 否则会收到有关{的错误{1}}不存在。)
然后你只提交结果:
foo.c
您已解决冲突,并在合并版本中设置了$ git commit
[ save the prepopulated commit message ]
和bar.c
。
(顺便提一下,moo.c
在这里描述的简单示例情况下对我有用,但我希望这通常更有用。)
从下面的评论中可以看出,您真正想要的是将这些文件重新合并为一个文件,并将两个分支中的文件更改合并。如果你想让git的合并策略来帮助你,那么每个分支上的文件必须在合并之前具有相同的路径,因此在合并之前你需要至少重命名其中一个。假设您希望将合并的文件称为git merge -s resolve
,当然,您也可以再次使其成为quux.c
。然后,您可以执行以下步骤,在合并之前重命名每个分支上的文件:
foo.c
如果更改没有冲突,那么此时合并应该Just Work。在我尝试的例子中他们确实发生了冲突,因此我需要编辑文件# 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
文件并提交结果:
git add
答案 1 :(得分:-2)
解决此问题的简单方法首先中止当前合并
git merge --abort
现在,决定要使用哪个版本的文件并使用合并策略(使用标志-s)
你是分公司的主人。如果要保留在master中设置的名称,请使用此命令
git merge -s ours task
如果您想使用任务中的版本
git merge -s theirs task