我最初误解了你的问题,以为你的意思与评论中澄清的不同,但原始答案可能仍有用,因此我将其作为第一部分保留,并在下面添加一个替代方案:
1. 只解决冲突,让你只剩下 diverged 的 moo.c 和 bar.c
在这里,我假设你想要的结果是在合并后拥有 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
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
我使用
--cached
删除
foo.c
,因为它已不在工作副本中,而
--cached
表示该命令仅查看索引 - 否则会出现
foo.c
不存在的错误。
然后您只需提交结果即可:
$ git commit
[ save the prepopulated commit message ]
您已经解决了冲突,合并版本中包含bar.c
和moo.c
。
(顺便提一下,在这里描述的简单情况下,git merge -s resolve
对我很有用,但我希望这对大家更普遍有用。)
2. 将bar.c和moo.c合并回一个文件
从您下面的评论中看来,您真正想要的是将这些文件再次合并为一个文件,并将两个分支中的文件更改合并在一起。如果您想让git的合并策略帮助您完成此操作,则每个分支上的文件在合并之前必须具有相同的路径,因此您需要在合并之前重命名它们中的至少一个。假设您希望合并后的文件名为quux.c
,当然您也可以将其重新命名为foo.c
。然后您可以执行以下步骤,在合并之前重命名每个分支上的文件:
$ 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%)
$ 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%)
$ git checkout master
Switched to branch 'master'
$ git merge task001
如果更改没有冲突,那么此时合并应该可以正常进行。在我尝试的示例中,它们发生了冲突,因此我需要编辑文件,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