git - 说服 git blame 一个分支比另一个分支与历史更相关

标签 git git-merge git-blame

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

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

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

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

  • 有人将文件复制到没有历史记录的新分支/存储库中。 我在一个分支中还有原来的历史,我想把它 merge 到新的分支中。

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

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

情况是这样的:

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

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

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

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

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

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

最佳答案

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

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

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

如果您真的想消除空白更改,以便 vanilla blame 给您想要的输出,您最好的选择是交互式 rebase ,您可以在初始提交的消息和作者下将这些提交压缩在一起,但这当然假设您还没有将代码推送到远程,这同样需要手动干预。

我知道你说过你不想传递额外的选项给 blame,但最简单和最一致的选择是传递 -w 标志,blame 或多或少会做你的事情用例描述,并告诉你最后一次实质性(非空白)更改的提交。

关于git - 说服 git blame 一个分支比另一个分支与历史更相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46167798/

相关文章:

git - 我可以使用 pip 从私有(private) VSTS 存储库安装包吗?

git - 在 GitHub 上 merge pull 请求后如何同步我的本地主分支?

git - 你如何检测 git 中的恶意 merge ?

git - 如果没有冲突则自动远程 merge

android - 如何在 android studio 中了解开发者代码责备

git - 如何返回:Gblame after selecting a particular commit?的结果

python - Google Cloud Function - 函数加载错误 : File main. 预期定义函数的 py 不存在

git - 如何在git中保留以前的提交者名称?

使用 Git 进行 WordPress 开发工作流程