我有做大量小提交的习惯,我很好.但我想不时地采取一些线性提交并将它们合并为一个只能提交能力来编写新提交消息的提交.
我查看了文档,但对我来说似乎有点神秘.有谁知道怎么做?
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
yfe*_*lum 55
假设您要重写树的历史记录,直到(但不包括)提交a739b0d
.
export EDITOR=vim # or your favorite editor
git rebase a739b0d --interactive
Run Code Online (Sandbox Code Playgroud)
请务必先阅读互动式变基.
kev*_*vmo 14
使用命令git rebase -i <commit>
where <commit>
是最后一次稳定提交的SHA.
这将带您进入编辑器,您可以在其中替换pick
每个提交旁边的标签,因为<commit>
您将其作为参数添加到交互式rebase命令中.在您要开始折叠的命令上,替换pick
为reword
以及之后要将其折叠到其中的每个提交,替换pick
为fixup
.保存,然后您将被允许提供新的提交消息.
您可以使用任意数量的提交压缩到一个提交
git rebase --interactive <commit>
Run Code Online (Sandbox Code Playgroud)