除了编写别名或脚本之外,是否有更短的命令来获取特定提交的差异?
git diff 15dc8^..15dc8
如果您只提供单个提交标识git diff 15dc8
,则会针对HEAD区分该提交。
答案 0 :(得分:607)
使用git show $COMMIT
。它将向您显示提交的日志消息,以及该特定提交的差异。
答案 1 :(得分:418)
使用:
git diff 15dc8^!
如git-rev-parse(1)联机帮助页(或现代git gitrevisions(7)联机帮助页)的以下片段中所述:
用于命名由提交及其形成的集合的另外两个简写 父承诺存在。 r1 ^ @表示法表示r1的所有父项。 R1 ^! 包括提交r1但排除其所有父母。
这意味着您可以在需要修订的git中的任何位置使用15dc8^!
作为15dc8^..15dc8
的简写。对于 diff 命令,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
答案 2 :(得分:53)
如果你知道多久,你可以尝试类似的东西:
# 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
答案 3 :(得分:10)
正如@mipadi指出的那样,您可以使用git show $COMMIT
,但这也会显示一些标头和提交消息。如果您想要直线差异,请使用git show --pretty=format:%b $COMMIT
。
这显然不是一个很短的手,所以我在我的.gitconfig中保留了这个别名
[alias]
sd = show --pretty=format:%b
这使我可以使用git sd $COMMIT
show diff 。
答案 4 :(得分:5)
如果您使用的是zsh且设置了git diff 15dc8^!
选项,则许多提到的示例(例如git diff 15dc8^..15dc8
或extendedglob
)都不起作用。您可以通过以下三种方式之一修复它:
unsetopt extendedglob
(和/或从.zshrc中删除)
setopt NO_NOMATCH
(和/或在.zshrc中设置)
每次用反斜杠逃脱插入符号,例如git diff 15dc8\^\!
答案 5 :(得分:3)
git diff 15dc8 15dce~1
~1表示'父母',~2'祖父母等等。
答案 6 :(得分:2)
$ git diff HEAD^1
另外,添加像hobs这样的别名很有用,如果你把以下内容放在〜/ .gitconfig文件的[alias]部分,那么你可以使用简写来查看head和previous之间的diff
[alias]
diff-last = diff HEAD^1
然后运行 $ git diff-last 会得到你的结果。请注意,这也将包含您尚未提交的任何更改以及提交之间的差异。如果您想忽略尚未提交的更改,那么您可以使用diff直接将HEAD与其父级进行比较:
$ git diff HEAD^1 HEAD
答案 7 :(得分:0)
使用别名,所以不能完全回答你的问题,但我觉得这些对于你想做的事情很有用......
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"