如何区分父项的提交?

除了编写别名或脚本之外,是否有一个比较简短的命令来获取特定提交的差异?

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 )不起作用。 您可以通过以下三种方法之一来修复它:

  1. unsetopt extendedglob (和/或从unsetopt extendedglob删除它)

  2. setopt NO_NOMATCH (和/或设置在setopt NO_NOMATCH中)

  3. 每次使用反斜线时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"