如何在不生成不同SHA1的情况下提交一个副本?

时间:2013-10-04 15:51:08

标签: git patch git-branch git-rebase git-patch

尽管我试图避免它,但我必须维护三个master - 等效分支,每个分支都有微小的变化。我一直在阅读git并使用它几年,所以我熟悉以下传统智慧:

  1. 除非有意义,否则不要merge。请改用rebase
  2. 如果你只需要提交一个提交,cherry-pick就是你的朋友。
  3. 推送前始终pull --rebase
  4. 保持功能符合rebase
  5. 他们没有告诉你的是传统的智慧创造了一堆几乎相同的提交,除了改变他们的SHA1的细微细节。为什么这很重要?它违背了将分支与git log --left-right --graph --cherry-pick --oneline branch1..branch2git show-branch进行比较的目的,这尤其令人讨厌。感觉像廉价分支的滥用。这使得几乎不可能看到每个分支中缺少哪些补丁。

    那么,如何使多个分支与相同的SHA1保持一致,以便可以使用这些工具?补丁是最好的方法吗?

2 个答案:

答案 0 :(得分:2)

您不能在多个地方保留具有相同SHA的提交,因为提交的“位置”(其在历史记录中的位置)由SHA 标识。

Git提交包含某些数据,其中包括当前repo状态的快照,当前时间和日期,提交者名称和电子邮件,和父提交的SHA

这意味着当您将提交放在其他位置(rebasecherry-pick,补丁+应用)或更改其时间(commit --amend)时, SHA将会有所不同

这是Git的一个重要特征(Git历史就是所谓的Merkle tree)。

正如您所注意到的,您可以使用我上面提到的各种历史记录重写命令来维护(content-)等效提交。


根据您的具体情况,可能能够使用master中的提交而无需复制它们。如果那些使你的“master - 等效”分支不同的变化纯粹是相加的(即它们出现在总是附加到master中的最新提交的提交中),那么你可以只是总是将你的其他分支重新绑定到master并感到高兴,因为它们只是完全包含所有master的提交。

另一方面,如果您的更改是需要在历史记录中早期插入的类型(即master 的新提交必须在之后附加 em>你的差异化变化),那么你将无法保持这样的“好”历史。

我不能自发地想到第二种情况的一个例子,但理论上它是可能的(无论是内容实际需要,还是项目规范等外部因素所要求的。)

答案 1 :(得分:0)

除非有意义,否则我认为不合并是传统智慧。如果您希望保持历史记录具有相同的SHA1哈希值,请合并,并避免采摘樱桃。