除了编写别名或脚本之外,是否还有更短的命令来获取特定提交的差异?
git diff 15dc8^..15dc8
如果仅提供单个提交ID git diff 15dc8
,则它将与HEAD进行比较。
除了编写别名或脚本之外,是否还有更短的命令来获取特定提交的差异?
git diff 15dc8^..15dc8
如果仅提供单个提交ID git diff 15dc8
,则它将与HEAD进行比较。
Answers:
使用git show $COMMIT
。它会向您显示该提交的日志消息,以及该特定提交的差异。
采用:
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
,这意味着commit(15dc8^
)的父对象与commit()之间的区别15dc8
。
注意:git-rev-parse(1)
联机帮助页中的描述涉及修订范围,在修订范围中,修订范围还需要与多个父级一起进行合并提交。然后r1^!
是r1 --not r1^@
“即r1 ^r1^1 ^r1^2 ...
”
另外,您可以git show COMMIT
用来获取提交描述和提交的差异。如果只需要差异,则可以使用git diff-tree -p COMMIT
^!
对于普通提交,父速记符号可以与difftool一起正常使用,但对于合并提交,diff则相反。为什么这样?
如果您知道有多远,可以尝试以下方法:
# 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
用来显示diff。
git diff 15dc8 15dce~1
〜1表示“父母”,〜2表示“祖父母”,依此类推。
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
使用别名,因此无法完全回答您的问题,但是我发现这些别名对您执行预期的工作很有用...
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"