如何区分父项的提交?
除了编写别名或脚本之外,是否有一个比较简短的命令来获取特定提交的差异?
git diff 15dc8^..15dc8
如果你只给了一个提交id git diff 15dc8
,它git diff 15dc8
HEAD提交。
使用git show $COMMIT
。 它会显示提交的日志消息,以及特定提交的差异。
使用:
git diff 15dc8^!
如以下git-rev-parse(1)联机帮助页(或现代git gitrevisions(7)联机帮助页)中所述:
存在另外两个用于命名由提交及其父提交形成的集合的简写。 r1 ^ @符号表示r1的所有父母。 R1 ^! 包括提交r1但排除其所有父母。
这意味着你可以使用15dc8^!
作为15dc8^..15dc8
在任何需要修改的git中的简写。 对于diff命令, git diff 15dc8^..15dc8
被理解为git diff 15dc8^ 15dc8
,这意味着commit( 15dc8^
)和commit( 15dc8
)的父级之间的区别。
注意 : git-rev-parse(1)
页中的描述涉及到修订范围 ,它也需要为多个父级的合并提交工作。 那么r1^!
是“ r1 --not r1^@
”即“ r1 ^r1^1 ^r1^2 ...
”
另外,你可以使用git show COMMIT
获取提交的提交描述和差异。 如果你只想diff,你可以使用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
来显示差异 。
如果您使用zsh并设置了extendedglob
选项,许多提到的示例(例如git diff 15dc8^!
或git diff 15dc8^..15dc8
)不起作用。 您可以通过以下三种方法之一来修复它:
-
unsetopt extendedglob
(和/或从unsetopt extendedglob
删除它) -
setopt NO_NOMATCH
(和/或设置在setopt NO_NOMATCH
中) -
每次使用反斜线时
git diff 15dc8\^\!
光标和重git diff 15dc8\^\!
,比如git diff 15dc8\^\!
上面Paul的解决scheme做了我所希望的。
$ git diff HEAD^1
另外,如果你在〜/ .gitconfig文件的[alias]部分添加如下内容,那么你可以使用上面提到的hobs这样的别名,那么你可以使用short-hand来查看head和previous之间的差异。
[alias] diff-last = diff HEAD^1
然后运行$ git diff-last会得到你的结果。 请注意,这还包括您尚未提交的任何更改以及提交之间的差异。 如果您想忽略您尚未提交的更改,则可以使用diff直接比较HEAD与其父项:
$ git diff HEAD^1 HEAD
git diff 15dc8 15dce~1
〜1表示“父母”,“2”祖父母等
使用别名,所以不完全回答你的问题,但我发现这些有用的做你想要的…
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"