【问题标题】:Convince git blame that one branch is more relevant to history than another说服 git blame 一个分支比另一个分支与历史更相关
【发布时间】:2018-02-20 09:49:38
【问题描述】:

我喜欢使用git blame 作为辅助形式的文档。检查提交的原因、提交时间和提交人非常有用。

但有时特定行的历史记录会丢失。可能发生这种情况的一些情况:

  • 进行了更改,但随后又恢复了。

  • 有人重新缩进文件并提交它。 稍后,标准缩进被恢复并提交。

  • 有人将文件复制到没有历史记录的新分支/存储库中。 我的分支中还有原始历史记录,我想将其合并到新分支中。

在所有这些情况下,git blame 将显示文件的最新更改,这通常不是很有用。例如。 “恢复缩进”或“恢复提交 #123”或“初始提交:所有文件”。

有什么方法可以向git blame 暗示我们对旧历史比对新历史更感兴趣?

情况如下:

... - A - B - C
  • 提交 A 对文件中的所有行都有很好的注释。
  • 提交 B 重新缩进了整个文件。
  • 提交 C(可能是还原)将文件恢复到提交 A 中的状态。

我想知道我们是否可以与优先父级执行神奇的 git 合并:

        .-------.
       /         \
... - A - B - C - D
  • 提交 D 告诉 git A 是 git blame 要遵循的优先级历史记录。

另一种我认为可以接受的可能性:

            E - F 
                 \
... - A - B - C - D
  • 提交 E 是一个新的空分支。
  • 提交 F 仅添加关注的文件。
  • 提交 D 合并两个历史记录,使 F 成为历史记录的优先级。

我希望让这成为历史的永久一部分。在搜索历史记录时,我对将额外的选项传递给 git blame 并不感兴趣。

【问题讨论】:

  • 切线观察:昨天 dev1 和 dev2 都将相同的 3 行修复粘贴到它们的分支中。 (因为它们并没有真正冲突,git 不介意两个分支上的行发生变化,并且可以自动合并它们。)我将 dev1 的分支合并到 master 昨天,他出现在 git blame。今天把dev2的分支合并到master中,现在dev2出现在git blame中。但是如果我返回并使用git merge -s ours dev2 进行合并,那么 dev1 会出现在 git blame 中,而不是 dev2。我想知道是否还有希望...... :)

标签: git git-merge git-blame


【解决方案1】:

理论上可以创建您的两个场景,但都不会产生您想要的输出,因为“更改”仍将被检测为提交 C 的一部分。两者都需要大量的手动工作才能到达那里。 (我必须测试在毫无根据的合并中会发生什么,但第二种情况实际上可能会通过合并删除您的 repo 中的所有其他文件。)

请记住,git 存储代码的快照,文件名、文件夹、行、提交消息等内容更像是描述 git 大脑内容的元数据。

Git blame 本质上只关心当前 blob 的内容以及该代码的来源。它不会看到合并分支和代码之间的变化,并继续寻找与报告不同的提交。

如果您真的想消除空白更改,因此 vanilla blame 将为您提供所需的输出,您最好的选择是交互式 rebase,您可以在初始提交的消息和作者下将这些提交压缩在一起,但这当然假设您还没有将代码推送到遥控器,这需要人工干预。

我知道你说过你不想传递额外的选项来责备,但最简单和最一致的选项是传递 -w 标志,并且责备将或多或少地按照你的用例描述,并告诉你提交最后一个实质性(非空白)更改到该行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2013-11-04
    • 2021-09-03
    • 2017-12-08
    • 1970-01-01
    相关资源
    最近更新 更多