在日常开发中,常常会遇到自己正在开发某个feature的时候,需要切到另外的分支去处理bug。于是先将未完成的功能commit到本地。处理完bug之后,再切回来开发,这种做法有一个坏处是,仓库commit的历史会很凌乱。不利于追踪排查历史问题。

以上为前提条件,这种情况可以使用 git rebase 来处理,合并多个本地的commit,今天以这边文章的提交历史,来做个示范。

注意,这种合并方式,只对未push到远端的commit有效

首先查看下这个仓库的提交历史记录:

1
git log 

输出如下图:

1551287799586

使用 rebase将多个commit合并成一个。

1
git rebase -i HEAD~[number_of_commits]

可以看到,我们这里有三条commit记录,只需要修改末尾的number_of_commits参数。

1
git rebase -i HEAD~3

终端输出如下图:

1551288202815

第一列是rebase具体执行的操作,其中操作可以选择,其中含义如下:

  • pickgit会应用这个补丁,以同样的提交信息(commit message)保存提交

  • rewordgit会应用这个补丁,但需要重新编辑提交信息

  • editgit会应用这个补丁,但会因为amending而终止

  • squashgit会应用这个补丁,但会与之前的提交合并

  • fixupgit会应用这个补丁,但会丢掉提交日志

  • execgit会在shell中运行这个命令

这里我们将第一个提交保留,将第二第三个提交合并到第一个提交里面去,将第二个和第三个commit前的pick改成s,然后保存退出。输出如下图:

1551288559899

修改commit信息,保存,并退出。然后使用git log 查看commit记录:

1551288728749

可以看到,刚刚的三条记录已经被合并了。接下来只需要push到远端仓库就行了。