【发布时间】:2019-01-21 13:30:17
【问题描述】:
我一直对“压缩”或重写历史持怀疑态度,现在我几乎确信我应该从我管理的存储库中禁止这种做法。但也许有人可以回答这个问题,并为我的壁球冠军同事节省一天的时间。
我刚刚遇到了一行代码,我想了解其背后的原因,所以我使用了git annotate 来找出是谁写的以及为什么写的。但它指向一个“压缩”提交,一长串关于无数功能和错误修复的提交消息头列表,没有详细信息。不是很有帮助。
'哦,但总是有 reflog,'我确信; “信息永远不会在 git 中丢失!”好的,很高兴听到它!但是我尝试了git reflog <squashed-commit-hash>,但根本没有输出——没有帮助。我还尝试了git rev-list <squashed-commit-hash>,得到了一个包含数百个哈希的列表,在使用git show 手动检查了其中一些之后,我得出结论,它们不是被压扁的部分——也没有帮助。
那么实际上是否有可能找出对那行代码有贡献的单个提交,并查看该提交的全部信息?是否可以在一个 git 命令中完成,而不必成为 bash 大师?还是说这些信息实际上已经在 git 中丢失了?
【问题讨论】:
-
“我几乎确信我应该从我管理的存储库中禁止这种做法。”你打算如何做到这一点,究竟是什么? Git 是一个分布式版本控制系统;在与您分享我的提交之前,我在自己的系统上所做的与您无关(您也不能说我已经做到了)。我想你可以通过政策来做到这一点,但我认为这样的政策毫无意义。
-
“但它指向一个 'squashed' 提交,一长串提交消息头,没有详细信息。没有真正的帮助。”压缩原始提交的人通常应确保新提交的提交消息是有用的。这可能涉及编辑旧的提交消息、替换它们或添加某种摘要。 Git 实际上会在 squash 期间提示用户输入新的提交消息,并提供旧消息作为起点。来自压缩的无用提交消息可能会在代码审查中被发现,就像常规提交消息和代码更改一样。
-
我认为“但是 reflogs!”论证回答了错误的问题。无论我是提交原始提交还是重写提交都无关紧要——无论哪种情况,我作为提交作品的人的责任是确保它是正确的、清晰的、通过测试等。如果在审查期间发现我的作品没有满足我需要修复的项目的任何标准。同样,您无法知道给定的提交是否是“原始的”。
-
嗯...只要提交实际上还没有发布,它们就会在远程。如果它们是(我怀疑它们是),并且最初的提交者选择丢弃它们,那么它们就永远消失了(除非他们想为它们深入研究 reflog)。如果您对最终生成的提交消息有疑问,
git commit --amend将允许您编辑 那个 特定的提交消息。 -
我的直觉告诉我,与在日常工作流程中使用此功能的人交谈会使您受益更多,这样您就可以更习惯他们的工作方式。我自己在某些情况下使用 rebase 和 squash,但我会尽我所能留下有用的信息;那些不是你一起工作的人,你肯定需要和他们谈谈。
标签: git git-squash git-blame