目录
- rebase的作用简要概括为:
- 命令:
- 解决冲突:
- 遗留问题:
rebase的作用简要概括为:
可以对某一段线性提交历史进行编辑、删除、复制、粘贴;因此,合理使用rebase命令可以使我们的提交历史干净、简洁!
但是需要注意的是:
不要通过rebase对任何已经提交到公共仓库中的commit进行修改(你自己一个人玩的分支除外)
命令:
基本格式如下
git rebase -i [startpoint] [endpoint]
其中-i的意思是–interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。
查看了log日志后,可以运行以下命令:
git rebase -i f8773b6c
或者:
git rebase -i HEAD~3
可以看到如下界面:
上面未被注释的部分列出的是我们本次rebase操作包含的所有提交,下面注释部分是git为我们提供的命令说明。每一个commit id 前面的pick表示指令类型,git 为我们提供了以下几个命令:
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
合并commit会用到squash,针对上面的提交可以改为:
pick 82fc74c7
s dc6c19fb
s f8773b6c
此时如果一切顺利,“wq” 或者 “ctrl+x" 就会进入编辑提交记录的界面,将多余的记录注释掉或者改一下,就可是再次 “wq” 或者 “ctrl+x" 保存退出了。
正常情况到这里就结束了,但总会有意外发生,如果在rebase多个提交的时候出想了冲突,合 并就终止,等待冲突解决后才能够继续。
解决冲突:
如果合并被中断,可以使用 “git status” 命令查看状态:
git status
会打印如下信息:
假设这里的冲突文件是 “a.go”,可以使用vi或者其它编辑工具处理冲突,然后用 “git add” 命令标记冲突已解决:
git add a.go
之后执行 “git rebase --continue” 继续合并提交。
git rebase --continue
注意:如果多个提将间冲突较多,可能需要重复上面解决冲突的步骤,直至全部冲突都被解决之后,合并才会成功。
遗留问题:
如果分支在合并commit之前,已经将某些需要被合并的commit通过push命令传到了远程仓库,那么在合并commit之后,那些本应合并在一起的提交还会出现在提交日志中。