除了编写别名或脚本,是否有更短的命令可以获取特定提交的差异?
git diff 15dc8^..15dc8
如果你只提供单个提交ID git diff 15dc8
,它将把该提交与HEAD进行比较。
使用git show $COMMIT
命令。它会显示该提交的日志信息和差异。
使用:
git diff 15dc8^!
根据git-rev-parse(1)手册的以下片段(或现代Git中的gitrevisions(7)手册),存在另外两个用于命名由提交及其父提交组成的集合的简写。r1^@符号表示所有r1的父提交,而r1^!则包括提交r1,但不包括其所有父提交。git diff 15dc8^..15dc8
被理解为git diff 15dc8^ 15dc8
,这意味着它计算提交(15dc8
)和其父提交(15dc8^
)之间的差异。
注意:在git-rev-parse(1)
手册中的描述涉及修订范围,需要在多个父提交的合并提交中工作。那么r1^!
就是“r1 --not r1^@
”,即“r1 ^r1^1 ^r1^2 ...
”。git show COMMIT
获取提交的描述和差异。如果只想获得差异,则可以使用git diff-tree -p COMMIT
。如果你知道需要回溯多远,你可以尝试这样做:
# Current branch vs. parent
git diff HEAD^ HEAD
# Current branch, diff between commits 2 and 3 times back
git diff HEAD~3 HEAD~2
之前的提交工作原理如下:
# Parent of HEAD
git show HEAD^1
# Grandparent
git show HEAD^2
你可以通过很多方式指定提交记录:
# Great grandparent
git show HEAD~3
详见此页面。
如 mipadi 指出,你可以使用git show $COMMIT
命令来查看提交的差异,但是它还会显示一些头部信息和提交消息。如果你想要一个简单的差异,可以使用git show --pretty=format:%b $COMMIT
。
显然,这不是一个非常简短的命令,因此我将其保存在我的.gitconfig文件中作为一个别名。
[alias]
sd = show --pretty=format:%b
这使我能够使用git sd $COMMIT
来显示差异。
git diff 15dc8^!
或git diff 15dc8^..15dc8
)在使用Z shell并设置了extendedglob
选项时无法正常工作。您可以通过以下三种方式之一修复它:
unsetopt extendedglob
(和/或从.zshrc中删除它)setopt NO_NOMATCH
(和/或在.zshrc中设置它)git diff 15dc8\^\!
git diff 15dc8 15dce~1
~1 表示“父级”, ~2 表示“祖先级”等。
保罗的解决方案做到了我所希望的。
$ git diff HEAD^1
[alias]
diff-last = diff HEAD^1
然后运行 $ git diff-last 就能得到你的结果。请注意,这也会包括你尚未提交的任何更改以及提交之间的差异。如果您想要忽略尚未提交的更改,则可以使用diff直接比较HEAD与其父级:
$ git diff HEAD^1 HEAD
这里使用了别名,所以并没有直接回答你的问题,但我发现这对于实现你想要的功能非常有用...
alias gitdiff-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitlog-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"