详解git rebase
rebase的基本概念
请参考
http://git-scm.com/book/zh/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E8%A1%8D%E5%90%88 和 http://gitbook.liuhui998.com/4_2.html
这两篇文章对git rebase的基本概念介绍的比较详细。
rebase实例讲解
下面我重点要讲的是rebase在使用时的细节。
实例如下:
假设我本地比远程服务器多出5次提交,如下图所示
我不想要中间的第3次commit,即"third"我不想要了,我想修改第2次提交"second"的内容,修改第1次提交的message,合并第四和第五次提交为一个提交。
执行过程如下:
在git bash中执行如下命令:
git rebase –i
会自动进入vi编辑器,如下图示
通过编辑各个commit来进行相关的操作。
常用的对commit的操作有5种:
p, pick = 使用此commit。(p是pick命令的缩写,两种方式均支持)
r, reword = 使用此commit, 编辑commit message
e, edit = 使用此commit,但是不编辑commit message,保持原有commit message
s, squash = 使用此commit,但是合并到前一个commit中去
f, fixup = 和squash类似,但是放弃此commit的message
commit应用的顺序可以调整,rebase操作将从上到下执行。
如果不使用此commit,则删除此行。
如果所有行都被删除,则放弃rebase操作。
那么要实现之前的目标:
不想要中间的第3次commit,即"third"我不想要了,我想修改第2次提交"second"的内容,修改第1次提交的message,合并第四和第五次提交为一个提交。
编辑这些行,如下图所示,第一个提交使用r,第二个提交使用edit,第三个提交删除行,第四个提交使用pick,第五个提交使用squash。修改完成后,保存退出。
因为是交互式rebase,会弹出第一次提交的message让你修改,将message修改为first reword.
然后保存退出。
第二次提交选择了修改内容,则用户可以修改代码文件修复原来的提交,也可以不修改,继续后面的rebase,git bash上提示了您接下来的操作。
修改文件后,执行git commit –amend。
将提交message改为second edit
继续rebase,执行git rebase –continue,由于我们放弃了中间的第3次提交,会碰到许多错误,其间的错误请通过git status命令查看解决方法。
此时碰到冲突,在windows文本编辑器中解决冲突,解决冲突后使用git add filename告诉git已经解决完冲突。
查看当前仓库状态git status
提示需要执行git commit –amend
继续rebase,执行git rebase –continue,rebase过程中碰到问题, 请查看图片中的红字。
继续rebase,git continue –rebase
继续rebase,git continue –rebase
查看历史,实现了我们之前的目标。
具体应用场景:
场景:
gerrit code review,编号123123123的提交对应的commit有问题,需要提交新的patch来修改这一问题;而45644依赖于123123123,此时应如何操作?
操作步骤:
1、 checkout右侧列表中Related Changes排在最上的review,此处为45644;单击45644,Download->checkout,拷贝指令
2、 在本地仓库右键->git bash
3、 粘贴拷贝的指令
4、 创建一个新的分支git checkout –b xxxx,其中xxx为分支名称,仅用于此次patch操作
5、git rebase -i交互式修改之前的patch,rebase的使用详情参见:4.常用操作#4.常用操作-_Toc394777088详解gitrebase,tortoisegit图形化可参考4.Tortoisegit#4.Tortoisegit-_Toc394850800Tortoisegitrebase
6、git add 修改过的文件
7、git commit --amend
8、git rebase --continue
9、重新push进行review