git diff重命名文件

Ken*_*awa 99 git diff rename

我有一个文件a.txt.

cat a.txt
> hello
Run Code Online (Sandbox Code Playgroud)

内容a.txt是"你好".

我做了一个提交.

git add a.txt
git commit -m "first commit"
Run Code Online (Sandbox Code Playgroud)

然后我a.txt进入了一个test目录.

mkdir test
mv a.txt test
Run Code Online (Sandbox Code Playgroud)

然后我做了第二次提交.

git add -A
git commit -m "second commit"
Run Code Online (Sandbox Code Playgroud)

最后,我编辑a.txt说"再见".

cat a.txt
> goodbye
Run Code Online (Sandbox Code Playgroud)

我做了最后一次提交.

git add a.txt
git commit -m "final commit"
Run Code Online (Sandbox Code Playgroud)

现在这是我的问题:

如何区分a.txt上次提交和第一次提交之间的内容?

我试过了 git diff HEAD^^..HEAD -M a.txt,但是那没用. git log --follow a.txt正确检测重命名,但我找不到相应的git diff.有吗?

CB *_*ley 105

HEAD^^和之间区别的问题HEAD是你a.txt在两个提交中都有一个,所以只考虑那两个提交(这是diff的作用),没有重命名,有副本和更改.

要检测副本,您可以使用-C:

git diff -C HEAD^^ HEAD
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

顺便提一下,如果你将差异限制在一条路径上(正如你所做的那样,git diff HEAD^^ HEAD a.txt你永远不会看到重命名或副本,因为你已经排除了除了单一路径之外的所有东西,并且根据定义重命名或复制 - 涉及两个路径.

  • 让我们说提交包含多个文件更改.我如何将其缩小到单个文件的差异? (2认同)
  • @KenHirakawa使用` - <old-path> <new-path>`...看我的答案. (2认同)

Nol*_*Amy 77

要区分特定文件的重命名,请使用-M -- <old-path> <new-path>(-C也可以).

因此,如果您在上次提交中重命名更改了文件,则可以通过以下方式查看更改:

git diff HEAD^ HEAD -M -- a.txt test/a.txt
Run Code Online (Sandbox Code Playgroud)

这会产生:

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
Run Code Online (Sandbox Code Playgroud)

(// a.txt添加行以帮助git检测重命名)


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

git diff HEAD^ HEAD -M01 -- a.txt test/a.txt
Run Code Online (Sandbox Code Playgroud)

git diff docs:

-M [<n>] - 查找重命名[= <n>]

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


ben*_*nkc 31

你也可以这样做:

git diff rev1:file1 rev2:file2

对于你的例子,这将是

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

请注意显式./- 否则此格式假定路径相对于repo的根.(如果你在回购的根目录中,你当然可以省略它.)

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

  • 哦哦,这个不错! (2认同)
  • 对于通过合并带来的其他文件更改的重命名,这是唯一对我有用的答案。谢谢! (2认同)