除了编写别名或脚本之外,是否有更短的命令来获取特定提交的差异?
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 中任何需要修订的地方使用15dc8^!
速记。15dc8^..15dc8
对于diff命令,git diff 15dc8^..15dc8
理解为,表示commit( )git diff 15dc8^ 15dc8
的parent和commit()的区别。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
来显示 diff。
如果您使用的是Z shell并设置了选项,则许多提到的示例(例如git diff 15dc8^!
,或git diff 15dc8^..15dc8
)都不起作用。您可以通过以下三种方式之一修复它:extendedglob
unsetopt extendedglob
(和/或从 .zshrc 中删除它)
setopt NO_NOMATCH
(和/或将其设置在 .zshrc 中)
每次都用反斜杠逃避插入符号和砰砰声,例如,git diff 15dc8\^\!
git diff 15dc8 15dce~1
~1 表示“父母”,~2 表示“祖父母”等。
Paul 的解决方案达到了我的预期。
$ git diff HEAD^1
此外,添加诸如提到的滚刀之类的别名也很有用。如果您将以下内容放在~/.gitconfig文件的 [alias] 部分,那么您可以使用速记来查看 head 和 previous 之间的差异。
[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"