Git错误地重命名(交换)文件。如何自动合并?

时间:2014-10-19 19:23:28

标签: git file-rename

我的文件正在某个分支上编辑,在我的分支中我将其名称与其他文件交换。 Git将报告两个文件的合并冲突并产生错误的diff

在每次合并之前,是否可以避免重复下面的结果?

$ git diff master
diff --git a/old.txt b/old.txt
index 7b4dc35..e73e0b4 100644
--- a/old.txt
+++ b/old.txt
@@ -1,4 +1,2 @@
-This is an old file.
-A Corrected Text again.
-More Text.
+This is a second file.
+Do not confuse with original.
diff --git a/old2.txt b/old2.txt
index e73e0b4..8f51c7b 100644
--- a/old2.txt
+++ b/old2.txt
@@ -1,2 +1,4 @@
-This is a second file.
-Do not confuse with original.
+This is an old file.
+A Corrected Text.
+More Text.

1 个答案:

答案 0 :(得分:2)

简短的回答是" no",因为git使用了重命名检测算法。

通常,在将一个提交与另一个提交进行比较时,diff会这样做:

  • 查找名称出现在两次提交中的所有文件:这些文件被修改(当然不变)。
  • 查找名称出现在第二次提交但不在第一次提交中的文件,其名称出现在第一次提交中但不出现在第二次提交中:这些是重命名检测的候选者。
  • 如果给出"找到副本"选项,查找名称出现在第二次提交但不是第一次提交的文件;这些是从"复制的候选人。第一次提交中存在的文件。

当您直接使用git diff时,您有一堆配置项和标志来控制应用的检测量​​,因为它是:diff.renameLimit-M,{{1} },特别是-C

当您使用--find-copies-harder默认(递归)策略时,git会将这些设置为通常运行良好的默认值。有一些(更少)控件可以调整它们:git mergemerge.renameLimit 1 Git将这些应用于内部运行的两个-X rename-threshold=...以便设置合并。

当然,问题在于所有情况下都适用第一个项目符号(具有相同名称的文件不被视为重命名候选者,有时仅作为候选副本)。因此,Git不会将这些视为重命名。


1 即使这些选项有点新:我记得合并时只是硬编码。也许您可以教导diff和merge以允许在两次提交中都存在文件名的情况下进行重命名检测。 (两者都在git中使用相同的底层diff代码,并使用控制各种选项的数据结构。)