【问题标题】:How to review merge commits to detect incorrect hunks如何查看合并提交以检测不正确的数据块
【发布时间】:2016-09-01 10:49:28
【问题描述】:

通常在审查合并提交时,我们会使用git diff-tree --cc <commit>(或简称为git show <commit>),但我面临以下问题:

假设您将B 合并到A 中,并且在解决冲突期间,您需要从AB 分支中选择一个大块来解决它。假设由于某种原因,A 中的帅哥取代了 B 中的帅哥,但因为您可能不知道它并仅通过例如判断。提交日期,您从B 分支中选择大块。

如果您没有进行其他修改,则通过git show 的多父差异将不会显示任何差异输出,因为生成的块完全在其中一个父提交中。

进一步详细说明,如果您有此冲突:

<<<<<<< HEAD
aaa
=======
bbb
>>>>>>> b

删除aaa hunk 并选择bbb,反之亦然,git show &lt;merge_commit&gt; 根本不会显示任何内容,从而阻止您查看合并期间选择了哪个hunk。

这可能会导致难以找到回归线。

如何查看在冲突解决过程中选择了哪些帅哥?

编辑:我所追求的是只查看有冲突的帅哥(因此不是自动合并的)。

【问题讨论】:

  • git show 没有向您展示与 A 的区别吗?
  • 来自docs 和经验,显示与diff-tree --cc 相同的输出,因此对于AB
  • 那么当你说'通过 git show 的多父差异不会列出任何东西'时你是什么意思?
  • 更新了问题
  • 好的,现在我明白了——正如文档所说,git diff-tree --cc“仅列出所有父母修改过的文件”。正如@torek 所说,您需要指定-m 来抑制这种行为并针对所有父母进行区分。

标签: git merge git-merge


【解决方案1】:

编辑:我所追求的是只查看有冲突的帅哥(因此不是自动合并的)。

不是您要寻找的答案:git 命令无法做到这一点。 git 不跟踪合并是如何以任何方式或方式解决的(git rerere 缓存除外,尽管这对我们没有帮助)。您需要类似“4-way diff”(A、B、公共父级和合并结果)之类的东西,我从未听说过。

理论上,您可以回过头来为自己编写一个程序,重新执行原始的 3 路合并以生成中间文件(带有冲突标记)并将 与合并结果进行比较. git 没有任何规定可以为你做这件事。

编辑:提到了git rerere,尽管在这里没有帮助。

【讨论】:

  • 是的,我确实想到了“重新播放合并以找出冲突的帅哥”之类的东西。认为可以单独通过git 完成。被接受为可悲的事实。
【解决方案2】:

将合并与特定父级(甚至所有父级)进行比较。

通常要比较的父母是第一父母,即HEAD^1HEAD~1HEAD^HEAD~(都表示相同的意思)。与二亲比较,选择HEAD^2(二亲没有其他简写方式:必须使用帽子后缀和数字)。

如果合并不是当前 (HEAD) 提交,则将 HEAD 替换为合并提交 ID。

要查看与 所有 父母的差异,您可以简单地 git show -m &lt;commit&gt;,它(仅在内部)“拆分”合并,以便该提交不是合并差异,而是差异一次对一个家长进行对抗每个家长。

因此:

git show -m <commit>

(一旦你看够了就停下来,或者如果你愿意,可以一直玩到最后)或者:

git diff <commit>^ <commit>

【讨论】:

  • 我希望有一些东西可以只显示冲突的帅哥。否则这会显示太多不相关的代码,特别是如果您必须扫描父母双方。如果您知道自己在寻找什么,这可能会起作用。如果合并的分支一开始就很大,那么对于常见的合并审查不是很有用。
  • 是的,绝对不是内置的。重新执行合并很容易(使用临时索引和工作树以及分离的 HEAD 或无提交标志),除了你可以'不知道当时应用了什么合并策略(-s)或扩展参数(-X ours-X rename-threshold-X ignore-space-*等)。
猜你喜欢
  • 2011-09-05
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 2021-04-09
  • 2016-08-24
  • 2016-06-27
相关资源
最近更新 更多