如何使用组合差异输出“混合显示”合并提交,即使每个更改的文件都与父母之一一致?

在做一个“简单的”合并(一个没有冲突)之后, 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使用组合的差异格式,它省略了与父版本中的任一个一致的文件。

有没有办法强制混帐仍然显示组合差异模式中的所有差异?

git show -m会显示差异(分别使用新版本和所有父版本之间的成对比较),但是我更喜欢在组合模式下在相应列中使用差异标记+/-。

不,没有办法做到这一点。 但是有时候它肯定会很好,在git源代码中执行起来可能相对容易(毕竟,你只需要告诉它不要修剪掉它认为是无关的输出),所以补丁就这样做了可能会被git维护者接受。

但是,要小心你所希望的; 将一个分支与三个月前分叉的一个分支合并在一起,相对于主线还是会有一个巨大的差异,所以这样的完全差异几乎完全没有帮助。 这就是为什么git不显示它。

看看提交信息:

 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并扭转它们。 所以为了得到你想要的差异,你可以这样做:

 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 

正如Kris Nuttycombe所指出的那样,迄今为止最好的解决scheme是

 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 

显示ee2de56上可以从fc17405提交到达的所有更改。 注意提交散列的顺序 – 它和合并信息中显示的一样: Merge: fc17405 ee2de56

还要注意3个点...而不是两个

有关已更改文件的列表,可以使用:

 git diff fc17405...ee2de56 --name-only 

您可以创build分支,HEAD将合并之前的一个提交。 那么,你可以做:

 git merge --squash testing 

这会合并,但不会提交。 然后:

 git diff 

我想你只需要'git show -c $ ref'。 在a8e4a59的git仓库上试用这个,会显示一个组合的diff(加/减字符在2列之一中)。 正如git-show手册提到的,它几乎委托给“git diff-tree”,所以这些选项看起来很有用。

似乎在这里回答: http : //thread.gmane.org/gmane.comp.version-control.git/191553/focus=191557

所以以类似的方式运行

$ git diff –cc $ M $ M ^ 1 $ M ^ 2 $(git merge-base $ M ^ 1 $ M ^ 2)

应该显示一个组合补丁,解释相对于父母和合并基础logging的状态$ M的状态。

在你的情况下,你只需要

 git diff HEAD^ HEAD^2 

或只是为你散列提交:

 git diff 0e1329e55^ 0e1329e55^2 

我构build了一个通用的方法来对合并的提交进行各种操作。

第一步 :通过编辑~/.gitconfig添加一个别名给git:

 [alias] range = "!. ~/.githelpers && run_on_merge_range" 

第二步 :在~/.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语法和/或逻辑。