git diff重命名文件
我有一个文件a.txt
。
cat a.txt > hello
a.txt
的内容是“你好”。
我做了一个提交。
git add a.txt git commit -m "first commit"
然后,我将a.txt
移动到test
目录中。
mkdir test mv a.txt test
然后我做第二次提交。
git add -A git commit -m "second commit"
最后,我编辑a.txt
来代替“再见”。
cat a.txt > goodbye
我做了我最后的承诺。
git add a.txt git commit -m "final commit"
现在这是我的问题:
我如何a.txt
上次提交和第一次提交之间的a.txt
内容?
我试过了: git diff HEAD^^..HEAD -M a.txt
,但是没有奏效。 git log --follow a.txt
正确检测重命名,但我找不到一个相当于git diff
。 有一个吗?
HEAD^^
和HEAD
之间的区别在于你在两个提交中都有一个a.txt
,所以只考虑这两个提交(这是diff的作用),没有重命名,有副本和更改。
要检测副本,可以使用-C
:
git diff -C HEAD^^ HEAD
结果:
index ce01362..dd7e1c6 100644 --- a/a.txt +++ b/a.txt @@ -1 +1 @@ -hello +goodbye diff --git a/a.txt b/test/a.txt similarity index 100% copy from a.txt copy to test/a.txt
顺便说一句,如果你限制你的差异只有一个path(就像你在git diff HEAD^^ HEAD a.txt
你永远不会看到重命名或副本,因为你已经排除了一个单一的path和根据定义,重命名或复制涉及两条path。
要区分特定文件的重命名,请使用-M -- <old-path> <new-path>
(- -C
同样适用)。
因此,如果您在上次提交中重命名并更改了一个文件,则可以看到更改:
git diff HEAD^ HEAD -M -- a.txt test/a.txt
这产生:
diff --git a/a.txt b/test/a.txt similarity index 55% rename from a.txt rename to test/a.txt index 3f855b5..949dd15 100644 --- a/a.txt +++ b/test/a.txt @@ -1,3 +1,3 @@ // a.txt -hello +goodbye
( // a.txt
添加了// a.txt
行来帮助git检测重命名)
如果git没有检测到重命名,你可以用-M[=n]
指定一个低的相似性阈值,比如1%:
git diff HEAD^ HEAD -M01 -- a.txt test/a.txt
从git diff文档 :
-M [<n>] – 查找重命名[= <n>]
检测重命名。 如果指定了
n
,则它是相似度指数的阈值(即与文件大小相比的添加/删除量)。 例如,-M90%
表示如果超过90%的文件没有改变,Git应该考虑删除/添加对是一个重命名。 如果没有%
符号,该数字将被读作一个小数,并在小数点之前。 即,-M5
变为0.5,因此与-M50%
相同。 同样,-M05
与-M5%
相同。 要将检测限制为精确重命名,请使用-M100%
。 默认的相似度指数是50%。
你也可以这样做:
git diff rev1:file1 rev2:file2
其中,例如,将是
git diff HEAD^^:./a.txt HEAD:./test/a.txt
注意明确的./
– 这种格式否则假设path是相对于回购的根。 (如果你是在回购的根源,你当然可以省略)。
这并不取决于重命名检测,因为用户明确指出要比较的内容。 (因此,在一些其他情况下,比如在git-svn环境中比较不同svn分支之间的文件也会派上用场。)