如何使用组合差异输出“混合显示”合并提交,即使每个更改的文件都与父母之一一致?
在做一个“简单的”合并(一个没有冲突)之后, 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语法和/或逻辑。