我可以很容易地找出自上次提交git diff HEAD^ -- <filename>
以来文件发生了什么变化,但是是否有一个等效的简写来查看特定文件的差异,因为它是上次提交的,不管从那以后发生了多少次提交?或者返回该特定文件的N次提交?
上下文:我在文件中发现了一个错误,我想在它偷偷进入时进行追踪。很容易获得git log -<n> <filename>
显示的特定文件的日志报告只有包含对该文件的更改的提交。很明显,我可以从log
报告中复制并粘贴SHA,但我真正想要的是能够执行git diff ^ -- <filename>
或git diff ~2 -- <filename>
之类的操作。
答案 0 :(得分:35)
$ git log -p <filename>
将显示日志消息以及每个触及指定文件的提交的差异。
要仅显示与先前版本的差异,请在日志历史记录中只请求一步:
$ git log -1 -p <filename>
答案 1 :(得分:3)
您可以使用git log
格式化来获取文件的先前提交的哈希值。例如,
git log --pretty=format:'%h' -1 --skip=1 <filename>
将为您提供触及特定文件的倒数第二个提交。实际上,如果您没有指定文件名,这将使您获得整个存储库的倒数第二次提交。要获得较旧的哈希值,您可以设置一个调用shell函数的git别名,如下所示:
[alias]
prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph"
要使用它,您需要键入类似git prior-hash n <filename>
的内容,其中n是文件的第(n + 1)个最新版本。因此,1将是第二次提交到文件,2将是第3次到最后,等等,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之间的差异,这可能是不可取的。
答案 2 :(得分:1)
git blame
可以让您快速到达目的地。