在Git上将一组提交合并为一个

Rod*_*ogo 64 git

我有做大量小提交的习惯,我很好.但我想不时地采取一些线性提交并将它们合并为一个只能提交能力来编写新提交消息的提交.

我查看了文档,但对我来说似乎有点神秘.有谁知道怎么做?

Ben*_*mos 57

假设你不关心保留任何现有的提交消息,你可以使用一个漂亮的(和快速的)git配方.首先,确保您的分支已签出:

git checkout <branch-to-squash>
Run Code Online (Sandbox Code Playgroud)

为安全起见,我们标记当前提交.

git tag my-branch-backup
Run Code Online (Sandbox Code Playgroud)

接下来,将分支HEAD移回到上一次良好提交(不修改工作空间或索引).编辑:最后一个好的提交是您希望保留的分支上的最新提交.

git reset --soft <last-good-commit>
Run Code Online (Sandbox Code Playgroud)

使用时git status,您会注意到功能分支上的所有更改现在都已暂存.剩下要做的就是......

git commit
Run Code Online (Sandbox Code Playgroud)

这种方法非常适合整合冗长,复杂的git历史和粗糙的合并.另外,没有合并/ rebase冲突需要解决!

现在,如果您需要保留任何现有的提交消息或执行比上述允许的任何更好的事情,您将需要使用git rebase --interactive.

解决方案来自: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

  • @MarceloMason好问题.请将"last good commit"解释为"您希望保留的分支上的最新提交".例如,如果你想将你的主题分支的历史记录一直压缩到它与主分支的分歧,那么最后一个好的提交将是master的"merge-base"和你的主题分支.如果你的分支上有10个提交并且只想巩固前五个,那么最后一个好的提交将是`HEAD~5`. (7认同)
  • 完成折叠提交后,可以使用“git push -f”将更改推送到远程。 (5认同)
  • 这是一个很好的答案 - 有310个提交压缩,似乎每个提交引入了rebase错误.使用您的方法快速,轻松,正确. (4认同)
  • 这种方法的另一个好处是,如果您不想要它们,您可以轻松地重置更改集的部分.通过在手前执行`git checkout -b my_squashed_branch`,可以轻松地在新分支上执行压缩. (3认同)
  • 在这种情况下,"最后一次好的提交"是什么? (2认同)

yfe*_*lum 55

假设您要重写树的历史记录,直到(但不包括)提交a739b0d.

export EDITOR=vim # or your favorite editor
git rebase a739b0d --interactive
Run Code Online (Sandbox Code Playgroud)

请务必先阅读互动式变基.

  • 但是,让我们说我想要"rebase"的提交是过去的方式,在一堆合并和分支之前......这仍然有效吗? (2认同)
  • 您的链接没有转到任何特定于我的地方。http://git-scm.com/book/en/Git-Branching-Rebasing 是 rebase 页面;http://git-scm.com/book/en/Git-Tools-Rewriting-History 有更多概述。 (2认同)

kev*_*vmo 14

使用命令git rebase -i <commit>where <commit>是最后一次稳定提交的SHA.

这将带您进入编辑器,您可以在其中替换pick每个提交旁边的标签,因为<commit>您将其作为参数添加到交互式rebase命令中.在您要开始折叠的命令上,替换pickreword以及之后要将其折叠到其中的每个提交,替换pickfixup.保存,然后您将被允许提供新的提交消息.

  • 实际上,我已经简明扼要地看到了最好的解释...... (2认同)

Mat*_*all 5

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

git rebase --interactive <commit>
Run Code Online (Sandbox Code Playgroud)

  • 当您已经或某些协作者已经进入Github的存储库时,考虑这种情况非常重要.见http://stackoverflow.com/questions/5667884/how-to-squash-commits-in-git-after-they-have-been-pushed (3认同)