如何与其父级进行提交?

时间:2009-01-12 18:03:57

标签: git git-diff

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

git diff 15dc8^..15dc8

如果您只提供单个提交标识git diff 15dc8,则会针对HEAD区分该提交。

8 个答案:

答案 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

请参阅this page for details

答案 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^..15dc8extendedglob)都不起作用。您可以通过以下三种方式之一修复它:

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

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

  3. 每次用反斜杠逃脱插入符号,例如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"