如何区分一个提交与它的父

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

git diff 15dc8^..15dc8

如果你只给出一个提交id git diff 15dc8,它会对HEAD进行区别。

155191 次浏览

使用git show $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

看到详情请浏览本页

使用:

git diff 15dc8^!

如下面git-rev-parse (1)手册页(或现代Git gitrevisions (7)手册页)的片段所述:

另外两个简写,用来命名一个由commit和its组成的集合 父提交存在。r1^@表示r1的所有父结点。r1 ^ ! 包含提交r1,但不包括它的所有父类

这意味着你可以在Git中任何需要修改的地方使用15dc8^!作为15dc8^..15dc8的简写。对于diff命令,git diff 15dc8^..15dc8被理解为git diff 15dc8^ 15dc8,这意味着commit的父类(15dc8^)和commit (15dc8)之间的区别。

: git-rev-parse(1)手册页中的描述谈到了修订ranges,其中它也需要用于合并提交,具有多个父级。那么r1^!就是"即“r1 ^r1^1 ^r1^2 ..."


同样,你也可以使用git show COMMIT来获取提交描述和提交的diff。如果你只想要diff,你可以使用git diff-tree -p COMMIT

作为米帕迪指出,你可以使用git show $COMMIT,但这也显示了一些头和提交消息。如果你想要一个直接的差异,使用git show --pretty=format:%b $COMMIT

这显然不是很简短,所以我将这个别名保留在.gitconfig中

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

这使我能够使用__abc0到显示差异

这使用别名,所以它不能准确地回答你的问题,但我发现这些对你想做的事情很有用……

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"
git diff 15dc8 15dce~1

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

保罗的解决方案做了我希望它会做的事情。

$ git diff HEAD^1

另外,添加诸如滚铣刀提到这样的别名也很有用。如果你将以下内容放在~ / .gitconfig文件的[alias]部分,那么你可以使用简写来查看头文件和前文件之间的差异。

[alias]
diff-last = diff HEAD^1

然后运行$ git diff-last将得到你的结果。注意,这也会包括你还没有提交的任何更改,以及两次提交之间的差异。如果你想要忽略你还没有提交的更改,那么你可以使用diff直接比较HEAD和它的父类:

$ git diff HEAD^1 HEAD

如果你正在使用Z shell并且设置了extendedglob选项,那么上面提到的许多例子(例如git diff 15dc8^!git diff 15dc8^..15dc8)都不能工作。你可以通过以下三种方法之一来修复它:

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

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

  3. 每次用反斜杠转义插入符号和bang,例如git diff 15dc8\^\!