我正在使用git flow。我制定了一些规则如何保持git历史记录清洁,因为我正在从这些提交生成更改日志。
但是一些旧的提交(直接开发)或合并的功能分支不遵循这些规则。在不影响所有当前分支(主,版本标签等)的情况下,压缩这些旧提交是否是一种简单的方法?
我熟悉功能分支内部的rebase,但我无法想象如何在develop / master分支中进行。
不.Git是一个简单的区块链,因为每个块(commit)都包含对前一个块的Id的引用。在Git中,块ID只是它们内容的散列,所以当你改变内容时,即使是一点点,散列也会改变,因此Id也是如此。由于父Id是块内容的一部分,因此您无法在不更改以下所有块的情况下更改这些早期块。更改父级意味着您需要更改子级,这意味着您需要更改子级的子级等。
这是完全可能的,但是对于正在基于旧提交工作的功能分支的每个人来说,这将会引起严重的麻烦。它还会破坏所有标记,这些标记将继续指向原始提交,除非您删除并重新创建每个标记,这可能会破坏正在进行构建的任何人,等等,从旧标记指针中删除。
基本上,你将不得不忍受一个凌乱的历史,拒绝遵循更现代的原则。有点像现实生活。
这个规则的唯一例外是你可以找到一些方法来攻击那些原始提交,以便生成hash collisions。这会欺骗以下提交,使他们认为他们仍然指向原始提交。这不容易实现,并且几乎肯定不可取,因为黑客提交看起来像一团糟,但Git uses SHA-1 has been cracked,所以它在技术上是可能的。