git diff file against its last change
是否可以让Git在一个特定的文件(因为它现在存在)和在最后一次提交更改它之前就存在的文件之间产生差异?
也就是说,如果我们知道:
1 2 3 4
| $ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit |
然后,git diff 456def myfile显示对myfile的最后更改。在没有git log所产生的知识的情况下,是否有可能做到这一点;123abc发生了什么变化?
- 我喜欢用git diff HEAD^ 。
- @asgs-没有按我的要求做(有两个原因——HEAD^是123abc,HEAD^^是456def;如果有其他不影响文件的承诺,那么HEAD^是指这些承诺)
- 你说得对,错过了"最后一次改变它的承诺"部分
使用git diff的方法之一是:
1
| git diff <commit> <path> |
引用最后一次提交的一个提交的一种常见方法是作为实际头的相对路径。您可以将以前的提交引用为head^(在您的示例中,这将是123abc)或head^(在您的示例中是456def)等…
所以你的问题的答案是:
号
- 哦,当然。我试了一下HEAD^,但当然没什么效果。没想到要试试HEAD^^。
- 对于很久以前的提交来说,语法可能更简单:HEAD~2。
- HEAD^^ myfile实际上指的是改变myfile的第二次到最后一次提交,这是不正确的(至少对于git 1.9.0是这样);它总体上指的是第二次到最后一次提交。是否有任何方法可以指定"我要查看对该文件所做的最后一次更改",而不指定提交哈希(提交哈希的一部分)或计算对该文件所做的最后一次更改与当前修订之间的提交数?
- 嗯,看起来git log -p很接近。
- @Kylestrand正如你所写的git log是一条路。但也看到这个答案
- @弗朗西斯科普加,谢谢。我已经更新了我的答案。
- @伊比沙曼酷!我把这个放在git gui工具添加git difftool -d HEAD~$ARGS,thx!
- 你知道我为什么会死吗:修订版不好^ ^ head'??我从克隆的根目录运行,并使用文件名的完全限定路径。Git状态很好,显示了我所有更改的文件。然后我运行Git Adv.java和Git提交,但是我想区分所有的文件,这样我就可以创建一个有意义的提交消息。
- 使用头而不是头或尝试使用头2
- 投反对票的原因:这个问题问"在一个特定的文件之间,因为它现在存在,并且在最后一次提交之前就存在",但是如果文件在最后一次总体提交中没有更改,这个答案就不起作用。
- 为什么会投反对票?它无法回答所问的问题>:。(
- @两年来,GMAN是唯一的答案,它大概"足够接近"许多人正在寻找的东西。
- @Kylestrand有点奇怪/不可思议,像这样的问题花了两年时间才得到答案。同样奇怪的是"足够近"但是…我的回答错了,所以很多人都投了赞成票。
- 如果您使用meld作为difftool:git difftool HEAD^ file。
这确实存在,但实际上是git log的一个特性:
1
| git log -p [--follow] [-1] <path> |
注意,-p还可以用于显示单个提交的内联差异:
。
使用的选项:
- -p(也叫-u或--patch隐藏在git-log手册页中,实际上是git-diff的显示选项。当与log一起使用时,它显示将为每个提交生成的补丁,以及提交信息&mdash;并隐藏不接触指定的提交。(此行为在--full-diff上的段落中描述,这导致显示每个承诺的完全差异。)
- -1只显示指定文件的最新更改(可以使用-n 1而不是-1;否则,显示该文件的所有非零差异。
- 需要--follow查看重命名之前发生的更改。
据我所知,这是立即查看对文件所做的最后一组更改的唯一方法,而不使用git log(或类似方法)来计算中间修订的数量或确定提交的哈希值。
要查看旧版本的更改,只需滚动日志,或指定从中启动日志的提交或标记。(当然,指定commit或tag会返回到最初的问题,即确定正确的commit或tag是什么。)
信用证到期:
- 多亏这个答案,我才发现了log -p。
- 感谢Franciscopuga,这个答案让我看到了--follow选项。
- Chrisbetti提到了-n 1选项,Atatko提到了-1变体。
- 感谢Sweaver2112让我真正阅读文档,并弄清楚-p在语义上是什么意思。
- 这对我来说是个很好的解决办法。在运行git log -p filename时显示了每个提交及其与当前文件的差异。
- 很完美。要查看最后的更改,只需添加-n 1参数即可。埃多克斯1〔12〕
- @克丽丝贝蒂,谢谢,我已经把它纳入我的答案了!
- -n 1也可以用-1代替,它不改变结果,我只喜欢语法:git log -p -1 filename。
- @阿塔特科,谢谢,我没意识到!我也喜欢这种语法。
- 我真希望人们能在他们的答案中解释旗子。(它的意思是"显示补丁",类似于仅更改行的diff)
- @你可以从答案本身看出,我很高兴从有用的评论中把新的信息加入到我的答案中。与其抱怨,为什么不建议改进呢?你甚至可以编辑答案。
- @Kylestrand我和Sweaver2112在一起,希望大家能解释国旗。我试图理解[--follow]选项,我找到了提供的链接,没有地方可以找到前面提到的来自franciscopuga的任何输入。那么,凯尔,--follow选项是什么,它做什么,为什么被推荐?
- @zipzit我确实说过它的作用:它在重命名之前显示更改。如果您不理解我所说的这是什么意思,那么就提交两次修改文件,然后重命名它,然后运行命令(不带-1)和不带--follow。
- 不过,看起来我的回答是错的。我已经解决了;正确链接中的答案解释了这个选项。
- 有一个有用的选项--skip=[n]"。您可以键入git log -p -1 --skip=1 来显示第二次提交。
如果您可以使用图形工具,这会很好地工作:
现在,Gitk将显示文件已更新的所有提交。标记提交将显示与列表中以前提交的差异。这也适用于目录,但是您也可以为所选提交选择要diff的文件。非常有用!
- 也很有用:git difftool HEAD^ file或git difftool -d HEAD^ path。