如何在保留“最新”提交的同时压缩大量“先前”提交?

如何在保留“最新”提交的同时压缩大量“先前”提交?

问题描述:

我已经克隆了one of Github boilerplate project,但忘记重置原始回购的历史,并且已经在其主分支上创建了相当数量的提交。如何在保留“最新”提交的同时压缩大量“先前”提交?

现在我的提交历史看起来像这样。

初始提交 - (数百样板提交) - (数十我提交的)

我想要做的就是“南瓜”(或“合并”如果“挤压”在这里不是一个适当的词)所有来自我从克隆的原始回购的提交,同时离开我最近的历史提交。我试图通过使用git rebase --root -i来做到这一点,但有数百个提交来压制(原始回购)并选择(我自己的回购),这使得很难这样做。

有没有一种方便的方法来实现这一目标?我不介意在我自己的承诺开始之前,我失去了所有的历史,或者如果我创建了一个新的回购协议。

假设最后的“锅炉板提交” SHA是abc123,和你的当前分支是master,请执行下列操作:

git branch my-new-branch master 
git checkout abc123 --orphan temp-branch 
git commit -m "Initial boilerplate code" 
git rebase --onto temp-branch abc123 my-new-branch 
git branch -d temp-branch 

这将让你与my-new-branch指向所有提交之后是锅炉板代码的单个壁球提交。你可以推动这个分支到一个新的回购,或者(如果这是一个本地唯一回购,或者你不介意做推力)去除master并将my-new-branch更名为master,或其他。

+0

不好意思打扰你,但你能解释一下'--orphan'和'--onto'在这种情况下做什么吗? –

+1

不用麻烦! '--orphan'创建一个没有父节点的分支,索引的内容匹配'abc123'。 'rebase --onto'“移动”'my-new-branch'可达到的所有提交,但'abc123'无法到达'temp-branch',以及移动'my-new-branch'指针本身。 –

为了做一个git壁球遵循这些步骤:

// X is the number of commits you wish to squash 
git rebase -i HEAD~X 

一旦壁球你的提交 - 选择s为壁球=将所有提交合并成一个单一的提交。

选择挑选作为最新的提交以保存它。

enter image description here