我有一个文件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你永远不会看到重命名或副本,因为你已经排除了除了单一路径之外的所有东西,并且根据定义重命名或复制 - 涉及两个路径.
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)
-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分支之间的文件.)