前面介绍的git rebase命令有一种强大的互动模式。接下来我们介绍怎么使用这种模式来改动过去的历史记录。查看当前的状态。

gitlab 修改所有分支的groupid gitlab修改commit消息_历史记录


启用互动模式,使用git rebase指令,加入-i参数

git rebase -i 28a728a

这个指令会弹出一个Vim编辑器。

gitlab 修改所有分支的groupid gitlab修改commit消息_vim_02


这个需要注意的是:

1、上面的顺序是与git log指令的结果是相反的

2、上面的picks是指保留这次Commit,不做改动。

把pick改成reword,表示要改动这两次的Commit信息。存档离开之后会出现一个Vim编码器画面。把内容改成add cat “kitty”

gitlab 修改所有分支的groupid gitlab修改commit消息_git_03


存档离开又会弹出另外一个个Vim编辑器界面

gitlab 修改所有分支的groupid gitlab修改commit消息_git_04


这是第二次的reword,把内容改成add cat sherly,存档离开之后,Git就会完成剩下的工作。

gitlab 修改所有分支的groupid gitlab修改commit消息_vim_05


这样就把两次记录修改了。看起来只是改了信息,其实Rebase的时候,Commit对象不只是剪切、粘贴而已。因为要接前一个Commit,所以会重新计算并计算出一个新的Commit对象。

要想取消这次rebase

git reset --hard ORIG_HEAD

接下来我们继续前进,试着尝试把多个Commit合并为一个Commit

gitlab 修改所有分支的groupid gitlab修改commit消息_3c_06


每次只添加一个文件,太过繁琐了,我们把这几个合并,使用Rebase的互动模式。

git rebase -i d5de0a6

gitlab 修改所有分支的groupid gitlab修改commit消息_git_07


把pick改成squash

gitlab 修改所有分支的groupid gitlab修改commit消息_git_08


最后一行的e3b218c会和前一个Commit e76d989合并,也就是add dog1会和add dog2合并在一起。以此类推。然后在弹出Vim编辑器界面,修改为add all cats和add all dogs。最后效果如下

gitlab 修改所有分支的groupid gitlab修改commit消息_历史记录_09


查看此时的Commit记录

gitlab 修改所有分支的groupid gitlab修改commit消息_git_10


我们也可也反过来操作,把一个Commit拆解成多个Commit。还是使用Rebase的互动模式。

git rebase -i d5de0a6

gitlab 修改所有分支的groupid gitlab修改commit消息_git_11


把要拆解的那个Commit的pick改成edit,我们把aee3c35的pick改成edit,在执行到aee3c35的时候这个Commit就会停下来。

gitlab 修改所有分支的groupid gitlab修改commit消息_3c_12


查看当前的状态。

gitlab 修改所有分支的groupid gitlab修改commit消息_vim_13


这时因为要把当前这个Commit拆解成两个Commit,所以要使用reset指令

git reset HEAD^

查看此时的状态

gitlab 修改所有分支的groupid gitlab修改commit消息_vim_14


可以看到这两个文件都被拆解出来了,而且还处于未跟踪的状态。add然后commit

gitlab 修改所有分支的groupid gitlab修改commit消息_vim_15


但现在还是处于Rebase状态。所以要让Rebase继续执行。

git rebase --continue

gitlab 修改所有分支的groupid gitlab修改commit消息_3c_16


查看此时的Commit记录

gitlab 修改所有分支的groupid gitlab修改commit消息_git_17