2013-01-22 38 views
16

我可以很容易地找出自从上次提交git diff HEAD^ -- <filename>以来,文件发生了什么变化,但是有一个相同的速记查看特定文件的差异,因为它是上次提交的,不管从那以后发生了多少次提交?或者返回N个特定文件的提交?快速查看文件以前版本的差异

语境:我发现在一个文件中的错误,我想追查,当它在悄悄这是很容易得到一个日志报告与git log -<n> <filename>一个特定的文件,只显示包括改变了提交文件。很显然,我可以从log报告中复制和粘贴SHA,但我真正想要的是能够执行诸如git diff^-- <filename>git diff ~2 -- <filename>之类的操作。

+2

你确定你不只是想'git blame'? –

回答

34
$ git log -p <filename> 

会向您显示日志消息以及每个触及指定文件的提交的差异。

展现给以前的版本唯一的不同,要求在记录历史只有一步:

$ git log -1 -p <filename> 
+1

我觉得奇怪的是,这似乎是OP最接近的东西,但它非常有用。谢谢。 –

+0

@MattMcHenry真的很好。我编辑了你的答案,并添加了在最后一次提交时只显示更改的语法,如OP中所述。 –

1

git blame应该让你到你的目的地非常快。

3

您可以使用git log格式来获取之前提交文件的哈希值。例如,

git log --pretty=format:'%h' -1 --skip=1 <filename> 

会让你第二次到最后一次提交触摸特定文件。事实上,如果你没有指定文件名,这会让你在整个存储库中第二次到最后一次提交。变老的哈希值,你可以设置一个git的别名调用一个shell功能,如:

[alias] 
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph" 

要使用它,你会键入类似git prior-hash n <filename>,其中n为(N + 1)个该文件的最新版本。所以1将是第二次到最后一次提交文件,2将是第三次到最后一次,等等,0将是最近触摸该文件的提交。再次,如果您想要检查整个回购,则文件名是可选的。

我相信你能弄清楚如何从那里建立一个diff命令:

[alias] 
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph" 
    diff-prev-easy = "!dp() { git diff $(git prior-hash $1 $2).. $2; }; dp" 

这将采用类似于现有哈希别名,git diff-prev-easy n <filename>。这将比较第(n + 1)个最后一个修订版和该文件的最新修订版。如果你想,而不是第一次修订比较(N + 1)至第n个最后的修改,这是一个简单的变化:

[alias] 
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph" 
    diff-prev = "!dp() { git diff $(git prior-hash $1 $2)..$(git prior-hash $(($1 - 1)) $2) $2; }; dp" 

其中,再次使用相同的方法:git diff-prev n <filename>

一个潜在的但要注意的问题是,git log按时间顺序列出提交,这可能不是您想要的。考虑这段历史:

1 - 2 - - - 4 - 5 master 
     \  /
     3 - -  develop 

我们git diff-prev 1命令会产生差异提交4和5之间,符合市场预期。但git diff-prev 2会显示提交3和4之间的差异,这可能是不可取的。

+0

我不知道OP,但这正是我所需要的。谢谢。 –