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分支之间的文件也会派上用场。)