我必须在git储存库中重写非常旧的提交,并且不确定是否可能。通过重写,我的意思是压榨并重新措辞一些提交。还值得一提的是,存储库中有很多合并提交,大多数应该保留。
所以,假设我的仓库是A <- B <- C <- D <- E <- ... X <- Y <- Z
,我必须压缩A
和B
并改写C
和D
。
好,我创建了一个新的分支tmp
,并完成了以下操作:
tmp
分支引用了D
提交。tmp
分支中有这样的内容-A' <- C' <- D'
。顺便说一句,rebase忽略D
之前的所有合并提交,但必须保留D
之后的所有合并提交,实际上是可以的。[现在我想以某种方式合并我的tmp
分支和master
分支以得到如下内容:A' <- C' <- D' <- E <- ... <- X <- Y <- Z
,所有合并提交都从E
开始。对我来说,似乎更改了提交E
的父级,但不确定是否可以这样做。可能还有其他一些方法可以实现我所需要的。
UPDATE
我试图在git replace D D'
分支上创建一个master
,并且在此git filter-branch -- tmp
之后,它几乎可以正常工作。不幸的是,当我在D
移到最底部之后执行替换命令时,历史记录看起来像A <- E <- F <- A' <- C' <- D' <- G <- ... <- X <- Y <- Z
,这对我来说很奇怪,但是当我尝试git replace C D'
时,除了重复的D
和[C0 ]提交。不知道这是否是一种好方法,但就我而言,这看起来像是唯一的方法。
对不起,如果造成混淆,我会尝试澄清是否不清楚。
我必须在git储存库中重写非常旧的提交,并且不确定是否可能。通过重写,我的意思是压榨并重新措辞一些提交。还值得一提的是,有很多...
您可以将D'
与git filter-branch
一起使用来“重设父级” parent-filter
。这些文档(包括仅做您想做的事情的示例)在这里:E