如果我尝试重现您的问题,我会遇到重命名/重命名冲突,正如我所料。首先,我创建了一个存储库和一些文件(具有独特的内容):
$ mkdir rename-exp
$ cd rename-exp/
$ git init
Initialized empty Git repository in /home/torek/tmp/rename-exp/.git/
$ cat > 1
This is file "1" in its initial state.
The file is being used
for a test of what happens with
a rename vs rename conflict
in Git.
The file needs some contents
so that git can detect the
rename when we actually
do the rename.
$ cat > 2
This is file "2".
We give it some contents
so that it has a unique SHA-1.
$ git add .
$ git commit -m initial
[master (root-commit) a4b6f52] initial
2 files changed, 12 insertions(+)
create mode 100644 1
create mode 100644 2
接下来,我创建分支b 并重命名。请注意,我是否使用git mv 或mv 后跟git rm --cached 和git add 进行重命名并不重要(但git mv 更容易,所以我使用它)。然而,重要的是 git 能够检测到重命名。这要求文件匹配 100% 完全匹配(简单的情况)或匹配“至少 50%”(此阈值可以调整,但 50% 是默认值)当 diff-ed 和 在git merge 出现时,旧名称 (1) 不再存在于两棵树中。
$ git checkout -b b
Switched to a new branch 'b'
$ git mv 1 1_b
$ git commit -m 'rename 1 to 1_b in branch b'
[b cc104b1] rename 1 to 1_b in branch b
1 file changed, 0 insertions(+), 0 deletions(-)
rename 1 => 1_b (100%)
然后我在master 中使用不同的名称目标进行相同的重命名:
$ git checkout master
Switched to branch 'master'
$ git mv 1 1_master
$ git commit -m 'rename 1 to 1_master in master'
[master b891757] rename 1 to 1_master in master
1 file changed, 0 insertions(+), 0 deletions(-)
rename 1 => 1_master (100%)
最后,我运行git merge:
$ git merge b
CONFLICT (rename/rename): Rename "1"->"1_master" in branch "HEAD" rename "1"->"1_b" in "b"
Automatic merge failed; fix conflicts and then commit the result.
$
您需要展示您的步骤(可能还有您的 git 版本),以便我了解为什么您的合并认为每个更改都是删除和创建(非冲突创建)而不是重命名。
影响这一点的其他变量:
- 合并期间
-X rename-threshold 的任何参数(这是您调整 50% 默认值的方式);
- 来自
git config --get merge.renameLimit 的值
-
git config --get diff.renameLimit 中的值,如果 merge.renameLimit 没有设置。