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

Git错误地重命名(交换)了文件。如何自动合并它们?,git,file-rename,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 Correcte

我有一个正在某个分支上编辑的文件,在我的分支中,我将其名称与其他文件交换。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.
简短的回答是“否”,因为git使用了重命名检测算法

通常,在比较一个提交与另一个提交时,diff会执行以下操作:

  • 查找名称出现在两次提交中的所有文件:这些文件将被修改(当然也可以保持不变)
  • 查找名称出现在第二次提交中但未出现在第一次提交中,以及名称出现在第一次提交中但未出现在第二次提交中的文件:这些文件是重命名检测的候选文件
  • 如果给定“查找副本”选项,则查找名称出现在第二次提交中而不是第一次提交中的文件;这些文件是“复制自”第一次提交中确实存在的文件的候选文件
直接使用
git diff
时,会有一组配置项和标志来控制应用的检测量,具体如下:
diff.renameLimit
-M
-C
,以及
——尤其是查找更难的副本

当您使用带有默认(递归)策略的
git merge
时,git会将这些设置为默认值,这些默认值通常工作得相当好。有一些(较少的)控件可以调整它们:
merge.renameLimit
-X rename threshold=…
。1 Git将这些控件应用于它内部运行的两个
Git diff
以设置合并

当然,问题是第一个要点(具有相同名称的文件不被视为重命名候选文件,只是有时被视为副本候选文件)适用于所有情况。因此Git不会将这些视为重命名


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