在做了一个“简单的”合并(没有冲突)之后,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将显示差异(分别使用新版本和所有父版本之间的两两差异),但我更喜欢在组合模式中,在各自的列中用+/-标记差异。


当前回答

不,git show没有办法做到这一点。但有时它肯定会很好,而且在git源代码中实现它可能相对容易(毕竟,您只需要告诉它不要删除它认为是无关的输出),因此git维护者可能会接受这样做的补丁。

不过,要小心你的愿望;合并一个分支与三个月前分叉的一行更改仍然会与主线有巨大的差异,因此这样的完全差异几乎完全没有帮助。这就是为什么git没有显示它。

其他回答

可以使用带-c标志的diff-tree命令。这个命令显示合并提交中更改了哪些文件。

git diff-tree -c {merged_commit_sha}

我从Git-Scm中得到了-c标志的描述:

这个标志改变了合并提交的显示方式 仅当命令中有——stdin)时才有用。 它显示了每个父节点与合并结果之间的差异 同时,而不是显示父母之间的差异 每次一个结果(这就是-m选项所做的)。 此外,它只列出从所有父级修改过的文件。

一个更好的解决方案(@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语法和/或逻辑。

不,git show没有办法做到这一点。但有时它肯定会很好,而且在git源代码中实现它可能相对容易(毕竟,您只需要告诉它不要删除它认为是无关的输出),因此git维护者可能会接受这样做的补丁。

不过,要小心你的愿望;合并一个分支与三个月前分叉的一行更改仍然会与主线有巨大的差异,因此这样的完全差异几乎完全没有帮助。这就是为什么git没有显示它。

这里似乎回答了: https://public-inbox.org/git/7vd392ezhx.fsf@alter.siamese.dyndns.org/

同理,跑步 $ git diff——cc $M $M^1 $M^2 $(git merge-base $M^1 $M^2) 应该显示一个组合补丁,解释在$M相对于 在父节点和合并基节点中记录的状态。