在Git上把一组提交合并成一个

我有做大量的小提交的习惯,我很好。 但是我不时想要一些线性提交,并将它们合并为一个提交,并提供一个新的提交信息。

我已经看过文档,但似乎有点神秘。 有谁知道如何做到这一点?

假设你想重写树的历史,直到(但不包括)提交a739b0d

 export EDITOR=vim # or your favorite editor git rebase a739b0d --interactive 

请务必先阅读交互式重新印刷 。

假设你不关心保留你现有的任何提交消息,那么你可以使用一个漂亮(快速)的git配方。 首先,确保你的分支被检出

 git checkout <branch-to-squash> 

为了安全,让我们标记当前的提交。

 git tag my-branch-backup 

接下来,将分支HEAD移回到最后一个好提交(不修改工作空间或索引):

 git reset --soft <last-good-commit> 

使用git status ,您会注意到您的function分支上的所有更改都已暂存。 剩下要做的就是…

 git commit 

这个方法对巩固冗长,复杂的git历史和粗糙的合并非常有用。 另外,没有合并/重组冲突来解决!

现在,如果你需要保留你现有的任何提交信息或者做比上面提供的更多的东西,你可以使用git rebase --interactive

解决scheme派生自: http : //makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit

参考: http : //git-scm.com/docs/git-reset

参考: http : //git-scm.com/docs/git-rebase

使用命令git rebase -i <commit>其中<commit>是最后一个稳定提交的SHA。

这将把你带到你的编辑器,在那里你可以replace自从<commit>包含在你的交互式rebase命令中作为参数的每个提交之后的标签pick 。 在你想要开始崩溃的命令上,用rewordreplacepick ,然后为每个你想要崩溃的提交,用fixupreplacepick 。 保存,然后你将被允许提供一个新的提交信息。

您可以使用任意数量的提交压缩到一个提交

 git rebase --interactive <commit>