当我们使用 Git 进行软件开发的时候,经常会碰到需要合并多次提交的场景。有的时候是因为上一次漏提交了代码,也有的是开发的代码分次进行了提交,反正发生的原因有很多种,一般工作中的项目也就不讲究随便去了,但是在社区项目中,这种就显得有点不专业了。今天博主分享一下 git rebase 的功能,是如何用来合并多次提交的。
修订上次提交
如果仅仅是对上一次提交的修改,最方便的方式还是使用 git commit --amend 命令。
# 补提交文件
git add a.txt
# 删除文件
git rm b.txt
# 修订上次提交
git commit --amend接下来会弹出一个窗口让你对提交信息就行修订,如果不想修改的话直接关闭就可以直接完成提交了。如果只是想修改提交信息,直接执行 git commit --amend -m "修改后的提交信息"。
合并多次提交
如果你已经进行了多次提交,那么就需要用到 git rebase 命令了。首先先用 git log --oneline 看下你的提交记录。

上图红框里的3个提交记录需要修改,其中 1 和 3 要合并成一次提交,并修改提交信息。这时我们可以使用 git rebase -i 1d5736c 来合并提交,这里的修订号要选择 1 的前一次提交。命令执行后会弹出一个 ./git/rebase-merge/git-rebase-todo 文件的文本编辑器,需要在这里来告诉 Git 该如何进行合并。

注释前面 pick 开始的行是初始值,也就是我们需要修改的地方,注释部分是帮助文档。这里每一行就是一次操作,执行顺序从上到下,你可以修改初始的执行顺序和操作,如果什么都不改则这次 rebase 操作什么都不会执行。
根据前面我们的修改要求,我们需要做下列的修改:
- 将 f3de84e的pick改为reword,因为我们要修改提交信息;
- 将 88368c6移到下一行,因为要让位置给dcd112d和f3de84e进行合并;
- 将 dcd112d移到上一行并修改为fixup,因为这一次提交要和f3de84e合并;
- 其他行保持不变。

注意:这里的修订号后面的提交信息只是给你看的,在这里修改它是没用的。
修改完后保存退出开始执行 rebase 操作。因为第一行我们设置成了 reword,所以马上再次弹出一个文本编辑器,这次是为了让你修改 f3de84e 的提交信息,我们在这里修改保存后就会继续执行 rebase 操作。很快执行完毕后,再看 git log --oneline 就会发现我们的提交记录改变了。

注意:在
rebase过程中如果中断了可以通过git rebase --continue继续,如果想放弃rebase可以执行git rebase --abort结束。
几种常用操作的说明
- pick: 表示合并开始,到下一次开始合并或者结束之间的多次提交会合并成一次提交;
- reword: 和- pick一样可以作为合并的开始,不同之处是允许你修改提交信息;
- edit: 和- reword类似,不同之处是还允许你修改提交内容;
- squash: 将这个提交合并到上一个;
- fixup: 和- squash类似,不同之处是不会合并提交信息,如果增加- -C则使用这次的提交信息,如果增加- -c则还会打开文本编辑器让你修改提交信息;
- drop: 丢弃这次提交。
 
                        
                        