是否有可能让git在特定文件之间产生差异,因为它现在存在,并且在最后一次更改它之前存在?
也就是说,如果我们知道:
$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit
然后git diff 456def myfile
显示myfile的最后一次更改。没有git log
产生的知识,是否可以做同样的事情; 123abc有什么变化?
答案 0 :(得分:209)
使用git diff的一种方法是:
git diff <commit> <path>
引用最后一次提交的一次提交的常用方法是作为实际HEAD的相对路径。您可以将以前的提交引用为HEAD ^(在您的示例中,这将是123abc)或HEAD ^^(在您的示例中为456def),等等...
所以问题的答案是:
git diff HEAD^^ myfile
答案 1 :(得分:177)
这确实存在,但它实际上是git log
:
git log -p [--follow] [-1] <path>
请注意,-p
也可用于显示单个提交的内联差异:
git log -p -1 <commit>
使用的选项:
-p
(也-u
或--patch
)在git-log
手册页中隐藏了deeeeeeeep,实际上是git-diff
的显示选项。与log
一起使用时,它会显示将为每个提交生成的补丁,以及不接触指定的提交信息和隐藏提交<path>
。 (--full-diff
上的段落中描述了这种行为,这会导致显示每个提交的完整差异。)-1
显示 指定文件的最新更改(-n 1
可以代替-1
);否则,显示该文件的所有非零差异。--follow
需要查看重命名之前发生的更改。据我所知,这是立即查看对文件所做的最后一组更改而不使用git log
(或类似)来计算干预修订数或确定哈希值的唯一方法提交。
要查看旧版本更改,只需滚动日志,或指定从中启动日志的提交或标记。 (当然,指定提交或标记会使您回到原始问题,即确定正确的提交或标记是什么。)
信用到期的信用:
log -p
。--follow
选项。-n 1
选项和atatko提及-1
变体。-p
&#34;的含义&#34;语义。答案 2 :(得分:6)
如果您使用图形工具很好,那么效果非常好:
[little:~] $ clang++ --version
clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
[little:~] $ clang++ --std=c++14 -o foo list_init.cc
[little:~] $ ./foo
ctor 0x1dfec30
ctor 0x1dfec50
dtor 0x1dfec50
dtor 0x1dfec30
caught exception.
done.
[little:~] $
gitk现在显示文件已更新的所有提交。标记提交将显示列表中先前提交的差异。这也适用于目录,但您也可以选择要为所选提交进行diff的文件。超级有用!