我有一个文件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
的等效内容。有吗?
答案 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
<强> -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