在做了一个“简单的”合并(没有冲突)之后,git show通常只显示如下内容
commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date: Tue Feb 22 00:27:17 2011 +0100
Merge branch 'testing' into master
这是因为,对于合并,git show使用组合的diff格式,省略了与父版本一致的文件。
有没有办法强制git在组合diff模式下仍然显示所有差异?
执行git show -m将显示差异(分别使用新版本和所有父版本之间的两两差异),但我更喜欢在组合模式中,在各自的列中用+/-标记差异。
查看commit消息:
commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date: Tue Feb 22 00:27:17 2011 +0100
Merge branch 'testing' into master
注意这一行:
Merge: fc17405 ee2de56
获取这两个提交id并反转它们。为了得到你想要的diff,你可以这样做:
git diff ee2de56...fc17405
只显示更改后的文件名称:
git diff --name-only ee2de56..fc17405
要提取它们,你可以把这个添加到你的gitconfig:
exportfiles = !sh -c 'git diff $0 --name-only | "while read files; do mkdir -p \"$1/$(dirname $files)\"; cp -vf $files $1/$(dirname $files); done"'
然后用它来做:
git exportfiles ee2de56..fc17405 /c/temp/myproject
一个更好的解决方案(@KrisNuttycombe提到过):
git diff fc17405...ee2de56
对于合并提交:
commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date: Tue Feb 22 00:27:17 2011 +0100
显示从fc17405上的提交可以到达的ee2de56上的所有更改。注意提交哈希的顺序-它与合并信息中显示的相同:merge: fc17405 ee2de56
还要注意这3个点…而不是两个!
对于已更改文件的列表,您可以使用:
git diff fc17405...ee2de56 --name-only
我构建了一种通用方法,用于在合并提交时执行各种操作。
步骤一:通过编辑~/.gitconfig为git添加别名:
[alias]
range = "!. ~/.githelpers && run_on_merge_range"
第二步:In ~/。Githelpers定义一个bash函数:
run_on_merge_range() {
cmd=$1; shift
commit=$1; shift
range=$(git show $commit | grep Merge: | awk '{print $2 "..." $3}')
echo "git $cmd $range $@"
if [ -z $range ]; then
echo "No merge detected"
exit 1
fi
git $cmd $range $@
}
第三步:盈利!
git range log <merge SHA> --oneline
git range diff <merge SHA> --reverse -p
git range diff <merge SHA> --name-only
这里可能有很多改进的空间,我只是把这些放在一起来克服一个恼人的情况。请随意嘲笑我的bash语法和/或逻辑。