前面介绍的git rebase命令有一种强大的互动模式。接下来我们介绍怎么使用这种模式来改动过去的历史记录。查看当前的状态。
启用互动模式,使用git rebase指令,加入-i参数
git rebase -i 28a728a
这个指令会弹出一个Vim编辑器。
这个需要注意的是:
1、上面的顺序是与git log指令的结果是相反的
2、上面的picks是指保留这次Commit,不做改动。
把pick改成reword,表示要改动这两次的Commit信息。存档离开之后会出现一个Vim编码器画面。把内容改成add cat “kitty”
存档离开又会弹出另外一个个Vim编辑器界面
这是第二次的reword,把内容改成add cat sherly,存档离开之后,Git就会完成剩下的工作。
这样就把两次记录修改了。看起来只是改了信息,其实Rebase的时候,Commit对象不只是剪切、粘贴而已。因为要接前一个Commit,所以会重新计算并计算出一个新的Commit对象。
要想取消这次rebase
git reset --hard ORIG_HEAD
接下来我们继续前进,试着尝试把多个Commit合并为一个Commit
每次只添加一个文件,太过繁琐了,我们把这几个合并,使用Rebase的互动模式。
git rebase -i d5de0a6
把pick改成squash
最后一行的e3b218c会和前一个Commit e76d989合并,也就是add dog1会和add dog2合并在一起。以此类推。然后在弹出Vim编辑器界面,修改为add all cats和add all dogs。最后效果如下
查看此时的Commit记录
我们也可也反过来操作,把一个Commit拆解成多个Commit。还是使用Rebase的互动模式。
git rebase -i d5de0a6
把要拆解的那个Commit的pick改成edit,我们把aee3c35的pick改成edit,在执行到aee3c35的时候这个Commit就会停下来。
查看当前的状态。
这时因为要把当前这个Commit拆解成两个Commit,所以要使用reset指令
git reset HEAD^
查看此时的状态
可以看到这两个文件都被拆解出来了,而且还处于未跟踪的状态。add然后commit
但现在还是处于Rebase状态。所以要让Rebase继续执行。
git rebase --continue
查看此时的Commit记录