方式一:两个分支之间的合并
远程分支和本地分支:git rebase 在没有参数的情况下,默认是git rebase 远程分支 本地分支
使用场景:小A和小B共用一个远程分支,小B提交了几次代码,当小A想要提交代码时,发现有冲突;
如果小A执行git pull并解决冲突,之后git add -> git commit,此时git log会出现一条merge的记录,类似
如果使用git rebase,在git log的记录里,没有Merge相关的commit,整个提交历史是一条直线。原理就是git会把我们当前的提交移到push之后
其他分支和当前分支:git rebase 其他分支 本地分支
使用场景:和上面类似,只是这个是将其他分支作为变基的基础,作用相当于git merge 其他分支 本地分支,但是少了Merge的commit
方式二:部分分支的合并
git rebase --onto 其他分支 本地分支 本地分支的子分支
--onto可以将本地分支的子分支合并到其他分支上,本地分支和本地分支的子分支之间的提交,不会出现在git rebase之后的提交中
使用场景:
- 从master分支切出feature1和feature2
- feature2 commit了3次
- 从feature2新切一个分支feature2/child
- feature2/child commit了1次 执行git rebase --onto feature1 feature2 feature2/child
只会合并feature2/child commit的那1次,不会携带 feature2 commit的3次
方式三: 修改一个分支上的某些提交
git rebase -i startCommitID
使用场景:如果想修改某个或某些commit,可以使用这个命令,最好是在当前代码还没有push到远程分支时使用;
每个commitId前面都有一些命令,修改这些命令可以合并commitId,删除commitId,修改commitId;
第一行不能使用s命令
比如git rebase -i 2a5eb63,会展示2a5eb63之后的commit,可以根据提示对这些commitId进行操作
需要注意的是,如果已经push到远程分支,再次push的时候可能会提示首先需要git pull,此时需要执行git push -f命令
最后,需要注意,在每次解决完冲突之后,都需要git add - > git rebase --continue(或者其他命令)