我最近遇到了一个问题,一个空文件在两个分支中以不同的方式重命名,但合并时没有引发冲突。
重建步骤如下。
创建一个空文件。

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选项中公开。
其他合并策略似乎也没有给出所需的行为。

08-25 07:33
查看更多