如何“git show”;合并提交与合并diff输出,即使每个更改的文件与其中一个父文件一致?

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

126559 次浏览

我认为你只需要'git show -c $ref'。在a8e4a59上的git存储库上尝试这个操作会显示一个组合的diff(在两列中的一列中加/减字符)。正如git-show手册提到的,它基本上委托给'git div -tree',所以这些选项看起来很有用。

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

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

查看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

您可以创建HEAD设置为合并前一次提交的分支。然后,你可以这样做:

git merge --squash testing

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

git diff

在你的情况下,你只需要

git diff HEAD^ HEAD^2

或者只是为你提交哈希:

git diff 0e1329e55^ 0e1329e55^2

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

同理,跑步

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

应该显示一个组合补丁,解释相对于$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

来显示ee2de56上所有可从fc17405上的提交访问的更改。注意提交哈希的顺序——它与合并信息:Merge: fc17405 ee2de56中显示的顺序相同

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

对于已更改文件的列表,您可以使用:

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

我构建了一种通用方法,用于在合并提交时执行各种操作。

第一步:通过编辑~/.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语法和/或逻辑。

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

git diff-tree -c {merged_commit_sha}

我从git scm中获得了-c标志的描述:

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

如果你的合并提交是commit 0e1329e5,如上所述,你可以通过以下方式获得包含在合并中的diff:

git diff 0e1329e5^..0e1329e5

我希望这能有所帮助!

如果你正在进行合并提交,那么这将显示差异:

git diff HEAD~1..HEAD

如果你不在合并提交,那么就用合并提交替换HEAD。这种方法似乎是最简单、最直观的。