1 使用场景
有时候开发一个功能,提交了多次,那么就会产生很多git commit信息。在一个开发比较频繁的仓库,这种提交方式会使得主干分支提交记录会看起来比较混乱。为了解决这种问题,我们可以通过合并提交,使git提交记录看起来更加简洁
2 合并命令
2.1 合并命令 : git rebase
git rebase可以用来改写历史。使用参数 -i,可以进入一个交互式页面。后面跟commit id,这个commit id需要注意,不是要修改的提交记录的commit id,而是要修改记录的父commit id。假设当前有三个提交记录,提交顺序依次是A-B-C,如果想要合并B、C的提交记录,那么commit id就是A。
git rebase -i <commit ID>
2.2 交互界面
进入交互界面可以看到,提交记录依次从上到下展示(提交记录越早越靠前展示)。每条记录分三个部分,分别是操作命令(如:pick)、commit id(如:bc0b8e0),提交信息(如:rebase3:add1)
2.3 操作命令
进入交互界面后,下面有注释,告诉了我们每个命令的作用,这里简单解释下
- p, pick:保留这个commit,不做任何处理,也是默认的命令
- r, reword:保留这个commit,但是修改提交信息
- e, edit:保留这个commit,但是rebase时会暂停
- s, squash:保留这个commit,但是会和上一个commit命令合并
- f, fixup:和squash相同,但是不会保存当前commit提交信息
- x, exec:执行其他shell命令
- b, break:删除该commit
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
# commit's log message, unless -C is used, in which case
# keep only this commit's message; -c is same as -C but
# opens the editor
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
需要注意以下场景
- 删除某个 commit 行,则该 commit 会丢失掉
- 删除所有的 commit 行,则 rebase 会被终止掉
- 可以对 commits 进行排序,git 会从上到下进行合并。
合并提交这里使用squash 或者 fix即可
3 使用示例
3.1 目标
合并最近三个提交
3.2 查看git提交历史
使用命令git log --oneline,找到父commit id:7f5ddad
3.3 进入交互界面
使用命令:git rebase -i 7f5ddad,将最下面两个提交记录的命令改为s,如下图所示,然后按ESC键退出编辑界面,输入wq保存退出
进入下面这个页面后,继续输入
wq保存退出
修改成功
使用命令git log --oneline,可以看到已经修改成功