如何使git正确区分替换文件

时间:2016-06-05 08:27:58

标签: git

在区分两个版本时,如何让git正确地跟踪文件被替换的历史记录?

这是一个例子。我创建一个文件[commit],移动它[commit],然后创建另一个同名[commit]的文件。

echo "original" > test.txt
git add .
git commit -m "First commit"
mv test.txt test2.txt
git add --all .
git commit -m "Rename"
echo "replace" > test.txt
git add .
git commit -m "Replace"

HEAD^^HEAD之间进行区分时,如何让git意识到test.txt真的是一个全新的文件?我能找到的最好的命令就像git diff -M100% -C100% HEAD^^,但是没有产生我想要的结果。

git diff -M100% -C100% HEAD^^
diff --git a/test.txt b/test.txt
index 4b48dee..6e8b374 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-original
+replace
diff --git a/test.txt b/test2.txt
similarity index 100%
copy from test.txt
copy to test2.txt

是否有更好的命令来获得这个预期的输出?

diff --git a/test.txt b/test.txt
index 4b48dee..6e8b374 100644
--- /dev/null
+++ b/test.txt
@@ -0,0 +1 @@
+replace
diff --git a/test.txt b/test2.txt
similarity index 100%
copy from test.txt
copy to test2.txt

1 个答案:

答案 0 :(得分:1)

不幸的是,没有。 Git始终进行启发式重命名检测,并且至少在当前,无论从提交DAG计算出的任何祖先路径如何,当您提交git diff两次提交时,它只是直接比较它们。在这种情况下,它正在比较HEAD^^HEAD,两者都有test.txt,第二个有test2.txt,所以它的启发式说明虽然test2.txt可能或可能不是某个其他文件的副本,test.txt未重命名。

(比较HEAD^^HEAD^时,test.txt中没有HEAD^,因此其重命名检测代码会查看test2.txt是否与之前的匹配test.txt。因此,如果它扫描从HEAD^^HEAD^HEAD的祖先路径,则其当前的启发式检测到重命名。但是它不会那样做。或者,如果Git可以选择在所有文件之间进行计算上昂贵的O(n 2 )比较,而不仅仅是那些没有对应的文件。 #34;差异和#34;差异,也可以发现重命名;但同样,它也没有。)