我最近遇到了一个问题,一个空文件在两个分支中以不同的方式重命名,但合并时没有引发冲突。
重建步骤如下。
创建一个空文件。
git init
touch empty
git add empty
git commit -m "add empty file"
在分支中重命名它。
git checkout -b branch
git mv empty empty-in-branch
git commit -m "empty -> empty-in-branch"
在母版中以不同的方式重命名。
git checkout master
git mv empty empty-in-master
git commit -m "empty -> empty-in-master"
将分支合并为主分支。
git merge --no-commit branch
这将显示消息
Automatic merge went well; stopped before committing as requested
。git status
只显示新文件。但不删除empty-in-branch
,因此如果在这个阶段提交,我们将得到两个文件。我希望这会被标记为需要手动解决的合并冲突(即决定要保留哪个空文件)。如果原始文件不是空的,就会发生这种情况。
影响重命名检测的空文件有什么特殊之处吗?是否有任何参数可以添加到
empty-in-master
中以使其检测冲突(例如调整合并策略)? 最佳答案
在此提交之后,在递归合并中重命名时不再考虑空文件:https://github.com/git/git/commit/4f7cb99ada26be5d86402a6e060f3ee16a672f16
旧版本的git仍然将其报告为冲突。
$ git --version
git version 1.7.9.5
# ... follow OP instructions to reproduce
$ git merge --no-commit branch
CONFLICT (rename/rename): Rename "empty"->"empty-in-master" in branch "HEAD" rename "empty"->"empty-in-branch" in "branch"
Automatic merge failed; fix conflicts and then commit the result.
$ git status
# On branch master
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both deleted: empty
# added by them: empty-in-branch
# added by us: empty-in-master
#
no changes added to commit (use "git add" and/or "git commit -a")
git并没有隐式地跟踪重命名,因此如果没有重命名检测,git只看到两个提交都删除了文件
empty
,并且每个提交都添加了一个新文件。有一个选项可以更改git diff(https://github.com/git/git/commit/90d43b07687fdc51d1f2fc14948df538dc45584b)的此行为,但当前它没有在
git merge
选项中公开。其他合并策略似乎也没有给出所需的行为。