493

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

git diff 15dc8^..15dc8

如果您只提供单个提交 id git diff 15dc8,它会将提交与 HEAD 进行比较。

4

8 回答 8

674

使用git show $COMMIT. 它将向您显示提交的日志消息,以及该特定提交的差异。

于 2009-01-12T18:06:26.960 回答
468

采用:

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.

于 2009-01-16T00:43:23.973 回答
58

如果您知道多远,您可以尝试以下操作:

# 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

有关详细信息,请参阅此页面

于 2009-01-12T19:34:29.653 回答
11

正如mipadi 指出的那样,您可以使用git show $COMMIT,但这也显示了一些标题和提交消息。如果您想要直接差异,请使用git show --pretty=format:%b $COMMIT.

这显然不是一个很短的手,所以我在我的 .gitconfig 中保留了这个别名

    [alias]
      sd = show --pretty=format:%b

这使我能够使用git sd $COMMIT显示 diff

于 2012-03-14T09:16:05.753 回答
6

如果您使用的是Z shell并设置了选项,则许多提到的示例(例如git diff 15dc8^!,或git diff 15dc8^..15dc8)都不起作用。您可以通过以下三种方式之一修复它:extendedglob

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

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

  3. 每次都用反斜杠逃避插入符号和砰砰声,例如,git diff 15dc8\^\!

于 2014-08-20T02:05:14.703 回答
3
git diff 15dc8 15dce~1

~1 表示“父母”,~2 表示“祖父母”等。

于 2012-11-26T15:40:51.450 回答
3

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
于 2013-12-06T12:08:44.813 回答
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"
于 2012-05-02T06:28:45.773 回答