git diff重命名文件

时间:2011-10-13 19:08:52

标签: git diff rename

我有一个文件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的内容?

我试过了:  git diff HEAD^^..HEAD -M a.txt,但这不起作用。 git log --follow a.txt正确检测到重命名,但找不到git diff的等效内容。有吗?

4 个答案:

答案 0 :(得分:104)

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

顺便提一下,如果您将差异限制在一条路径上(就像在git diff HEAD^^ HEAD a.txt中那样,您将永远不会看到重命名或副本,因为您已将所有内容排除在单个路径之外并重命名或副本 - 按定义 - 涉及两条路径。

答案 1 :(得分:72)

要对特定文件的重命名进行区分,请使用-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行以帮助git检测重命名)


如果git未检测到重命名,您可以使用-M[=n]指定低相似度阈值,例如1%:

git diff HEAD^ HEAD -M01 -- a.txt test/a.txt

来自the git diff docs

  

<强> -M并[d; N&GT;]   --find-重命名[=&LT; N&GT;]

     

检测重命名。如果指定n,则它是相似性指数的阈值(即,添加/删除的量   与文件的大小相比)。例如,-M90%表示Git应该   如果超过文件的90%,则认为删除/添加对是重命名   没有改变。如果没有%符号,则该数字应被视为a   分数,前面有一个小数点。即,-M5变为0.5,并且   因此与-M50%相同。同样,-M05-M5%相同。至   将检测限制为精确重命名,请使用-M100%。默认相似度   指数是50%。

答案 2 :(得分:27)

你也可以这样做:

git diff HEAD^^:./a.txt HEAD:./test/a.txt

,对于您的示例,将是

./

请注意显式#footer { width: 75%; background: dimgray; height: 150px; /* position: relative; */ bottom: 0; position: fixed; display: flex; display: -webkit-flex; } #footer ul { width: 100%; display: -webkit-flex; display: flex; flex-direction: row; justify-content: space-around; -webkit-justify-content: space-around; } #footer li { width: 30%; height: 130px; list-style: none; border: 1px solid white; } - 此格式另外假设路径相对于repo的根。 (如果你在回购的根目录中,你当然可以省略它。)

这完全不依赖于重命名检测,因为用户明确说明了要比较的内容。 (因此,它在其他一些情况下也很方便,比如在git-svn环境中比较不同svn分支之间的文件。)

答案 3 :(得分:1)

如果您的重命名提交已进行但尚未提交,则可以使用:

git diff --cached -M -- file.txt renamed_file.txt