即使每个更改的文件都与父母之一同意,如何"git show"合并提交与组合diff输出?

Til*_*gel 175 git merge

在进行"简单"合并(一个没有冲突)后,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
Run Code Online (Sandbox Code Playgroud)

这是因为,对于合并,git show使用组合的diff格式,该格式省略了与任一父版本一致的文件.

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

git show -m将显示差异(分别使用新版本和所有父版本之间的成对差异),但我更愿意在相应的列中使用+/-标记的差异,如组合模式.

rip*_*747 245

查看提交消息:

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
Run Code Online (Sandbox Code Playgroud)

注意这条线:

Merge: fc17405 ee2de56
Run Code Online (Sandbox Code Playgroud)

拿这两个提交ID并反转它们.所以为了得到你想要的差异,你会做:

git diff ee2de56..fc17405
Run Code Online (Sandbox Code Playgroud)

仅显示已更改文件的名称:

git diff --name-only ee2de56..fc17405
Run Code Online (Sandbox Code Playgroud)

并提取它们,您可以将它添加到您的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"'
Run Code Online (Sandbox Code Playgroud)

然后通过这样做来使用它:

git exportfiles ee2de56..fc17405 /c/temp/myproject
Run Code Online (Sandbox Code Playgroud)

  • 一个更好的解决方案是`git diff fc17405 ... ee2de56` - 这将显示ee2de56上可以从fc17405的提交中获得的所有更改,我相信这是你想要的.注意3个点而不是2个点. (40认同)
  • 好像,我的编辑被拒绝了.总结:你的差异没有显示哪个分支来自哪个分支.并且您无法区分是在第二个分支中添加了更改还是在第一个分支中删除了更改. (6认同)
  • @KrisNuttycombe 3 个点和顺序。你的评论正是我想要的,我认为这更像是OP想要的。 (3认同)

CoD*_*anX 66

更好的解决方案(@KrisNuttycombe提到):

git diff fc17405...ee2de56
Run Code Online (Sandbox Code Playgroud)

对于合并提交:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100
Run Code Online (Sandbox Code Playgroud)

显示所有ee2de56可以从提交中获得的更改fc17405.请注意提交哈希的顺序 - 它与合并信息中显示的相同:Merge: fc17405 ee2de56

另请注意3个点...而不是2 个点!

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

git diff fc17405...ee2de56 --name-only
Run Code Online (Sandbox Code Playgroud)


sid*_*e2k 11

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

git merge --squash testing
Run Code Online (Sandbox Code Playgroud)

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

git diff
Run Code Online (Sandbox Code Playgroud)


max*_*630 6

似乎在这里回答: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 处的状态相对于其父级和合并基础中记录的状态。


Bru*_*son 6

如果您坐在合并提交中,那么这将显示差异:

git diff HEAD~1..HEAD

如果您不在合并提交中,则只需将 HEAD 替换为合并提交。这种方法似乎是最简单、最直观的。


ape*_*arr -3

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

但要小心你想要的东西; 合并一个分支与三个月前分叉的单行更改仍将有一个巨大的差异与主线,所以这样一个完整的差异几乎完全没有用.这就是git没有表现出来的原因.

  • 请不要说"没办法做到这一点",因为很明显它是可能的 - 请参阅其他答案.这是非常误导的说法. (14认同)