在区分两个版本时,如何让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
答案 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;差异,也可以发现重命名;但同样,它也没有。)