[英]How can a git diff between a merge commit and one of its parents be empty?
[英]How to "git show" a merge commit with combined diff output even when every changed file agrees with one of the parents?
在做了一个“简单”的合并(一个没有冲突的)之后, 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 在组合差异模式下仍然显示所有差异?
执行git show -m
将显示差异(分别使用新版本和所有父版本之间的成对差异),但我更喜欢在组合模式下在相应列中用 +/- 标记差异。
查看提交消息:
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
更好的解决方案(@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
还要注意三个点...
而不是两个!
有关已更改文件的列表,您可以使用:
git diff fc17405...ee2de56 --name-only
您可以在合并前将 HEAD 设置为一次提交来创建分支。 然后,你可以这样做:
git merge --squash testing
这将合并,但不会提交。 然后:
git diff
似乎在这里回答: 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 处的状态相对于其父级和合并基础中记录的状态。
如果您坐在合并提交中,那么这将显示差异:
git diff HEAD~1..HEAD
如果您不在合并提交中,则只需将 HEAD 替换为合并提交。 这种方法似乎是最简单、最直观的。
我认为你只需要'git show -c $ref'。 在 a8e4a59 上的 git 存储库上尝试此操作会显示组合差异(两列之一中的加/减字符)。 正如 git-show 手册所提到的,它几乎委托给“git diff-tree”,因此这些选项看起来很有用。
如果您的合并提交是提交 0e1329e5,如上所述,您可以通过以下方式获取此合并中包含的差异:
git diff 0e1329e5^..0e1329e5
我希望这有帮助!
在你的情况下,你只需要
git diff HEAD^ HEAD^2
或者只是为你提交哈希:
git diff 0e1329e55^ 0e1329e55^2
您可以使用带有 -c 标志的 diff-tree 命令。 此命令显示合并提交中哪些文件发生了更改。
git diff-tree -c {merged_commit_sha}
我从Git-Scm得到了 -c 标志的描述:
这个标志改变了合并提交的显示方式(这意味着它只有在给定一个命令或 --stdin 时才有用)。 它同时显示每个父级与合并结果的差异,而不是一次显示一个父级和结果之间的成对差异(这是 -m 选项的作用)。 此外,它仅列出所有父项修改过的文件。
我构建了一种通用方法来对合并的提交执行各种操作。
第一步:通过编辑~/.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 语法和/或逻辑。
不,没有办法用git show
做到这一点。 但有时它肯定会很好,并且在 git 源代码中实现它可能相对容易(毕竟,你只需要告诉它不要修剪掉它认为无关的输出),所以补丁这样做可能会被 git 维护者接受。
不过要小心你想要什么; 将一个分支与三个月前分叉的单行更改合并,与主线相比仍然会有巨大的差异,因此这样一个完整的差异几乎完全没有帮助。 这就是为什么 git 不显示它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.