2023/01/28 深入了解git rebase

131 阅读2分钟

git rebase -i [commitID]

平时常用rebase命令是的git rebase master,但是这个master其实也就是master分支的最新提交而已,所以使用git rebase -i commitID,只是特殊指定了一个id,让这个id以后的提交进行重整。

需求

在feature分支上有f1,f2,f3三次提交,但其实前三个提交修改的是同一个需求,我们希望将这三个提交合并成一条提交记录: image.png

第一步

// 此处的commitID要使用f1之前的那次提交的ID
git rebase -i [commitID]

当执行命令后,会出现以下界面 image.png 我们可以从注释信息中得出:

  1. pick表示采用当前这条提交信息
  2. reword表示采用这条提交信息但修改提交信息
  3. squash表示采用这条提交信息,并且并入前一条提交里

第二步

我们的需求就是将f2,f3合并到f1的提交里,所以只需要将f2,f3之前的pick改为squash或者s就可以了。 image.png 首先按i,进入编辑模式,修改后,按esc退出编辑模式,再输入:wq保存并退出修改。

第三步

接着又会跳出一个vim界面: image.png 我们可以在这个页面修改提交信息,将三次提交的信息做一个概述: image.png

成果

经过前面的三部曲,我们成功在本地分支合并了这三个提交: image.png

最后使用需要git push -f进行提交,从而改变远程的提交记录。 需要注意的是,这样处理过的分支,如果有其他人也在这个分支上工作,则需要提醒他使用git pull --rebase进行拉去之后再开发。

解决冲突

在feature分支上,希望将master上最新的内容rebase过来git rebase master,但产生了冲突: image.png git给了我们两个选择:

  1. 手动解决冲突后继续 rebase
// 解决冲突后需要将冲突的文件存入暂存区中
git add .
git rebase --continue
  1. 放弃本次 rebase
// 
git rebase --abort