繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM