Git命令之rebase合并分支
零、使用场景
正常合并分支,我们一般都用git merge命令,这样子会导致git的graph有交叉,而不是一条直线。
交叉是这样子的(当三个人在master上拉出分支开发,然后在master上进行merge操作时)
![image-20210918200023159](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222008347-1397120759.png)
为了开发清爽,保证没有交叉点,这个时候可以使用git rebase命令来合并分支。
1、git rebase实现合并分支的步骤(举例说明)
①在master分支上拉出一个branch4分支,拉出一个branch5分支,拉出一个branch6分支,进行测试。
②先直接在master上添加一个文件,便于后续的观察,添加完文件后,使用git add 和git commit 以及git push推送到远端master分支上。
③在branch4,branch5,branch6上依次添加新文件,然后使用git add 和git commit 以及git push推送到远端各自的分支上,这样添加三次,每个branch上都有三次记录,这样的目的也是为了更直观的观察现象。
做完以上三步,可以看到的graph图形是这样子的。
![image-20210919140634564](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222008960-560892225.png)
④先用branch4来进行测试,使用rebase的方式合并到master分支上。
真正的rebase步骤(合并branch4分支到master分支)
step1:先切到branch4分支
git checkout branch4
![image-20210919145212303](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222009462-1582427976.png)
step2:使用rebase命令把自己的commit信息复制到master分支上
git rebase master
![image-20210919145303607](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222009845-1141281969.png)
备注:执行了rebase master后使用git status时,会出现该信息,告知你落后于branch4分支,让你使用git pull合并远程分支,此时忽略该信息即可。
step3:切换到master分支
git checkout master
![image-20210919145745594](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222010063-509276600.png)
step4:在master上merge branch4分支
git merge branch4
![image-20210919145920685](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222010305-1595505183.png)
step5:推到远程master分支
git push
![image-20210919150019975](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222010583-1808830343.png)
step6:查看graph
![image-20210919150250327](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222010855-805541774.png)
备注:此时可以看到,已经合并了branch4上的commit信息到master上了,且没有交叉出现,大功告成。
⑤同样的步骤,把branch5和branch6都合并到master上。
⑥查看graph
![image-20210919150716406](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222011210-1950061114.png)
备注:此时可以看到,已经合并了branch5和branch6上的commit信息到master上了,且没有交叉出现,大功告成。
⑦把branch4,branch5,branch6删除后,再看看实际的graph效果(一条线,清爽)
![image-20210919150950833](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222011461-1472054786.png)
二、git rebase解决冲突
当使用rebase命令时,会出现冲突的情况,我们来模拟一下解决冲突的过程。
①在master分支上,添加一个文件为master_file_for_rebase_test.txt文件,文件内容为AAA
![image-20210919214634951](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222011784-1815850203.png)
②在master上checkout出一个分支branch_a
③在master上修改文件master_file_for_rebase_test.txt,内容为BBB
![image-20210919214821533](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222011982-968003940.png)
④此时branch_a分支中master_file_for_rebase_test.txt文件内容还依旧是AAA,我们来修改为CCC
![image-20210919215025297](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222012496-2059389593.png)
⑤此时的graph是这样子的
![image-20210919215100865](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222012704-1131858961.png)
⑥这个时候在branch_a分支rebase master分支
git checkout branch_a
git rebase master
![image-20210919215332534](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222012930-1928741983.png)
此时提示我们冲突文件是master_file_for_rebase_test.txt,不能合并分支bba6994这个commit,要我们手动解决冲突,然后执行git add 或者git rm文件,然后再执行git rebase --contiue继续变基,当然,也可以直接git rebase --skip跳过这个commit,或者使用git rebase --abort放弃rebase。
这个时候,我们可以这么解决rebase的冲突
step1:查看冲突的文件master_file_for_rebase_test.txt
![image-20210919215903650](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222013165-698963771.png)
step2:手动编辑文件,选择要保存的内容,我们要保存CCC,所以我们把BBB删了,手动修改后是这样子的
![image-20210919220010636](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222013525-575673750.png)
step3:使用git add命令保存更改
git add master_file_for_rebase_test.txt
![image-20210919220303241](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222013712-346193846.png)
step4:运行git rebase --continue继续变基(这里不要使用git commit命令,只需要add即可)
git rebase --continue
此时会出现vim窗口,让你修改那个变基冲突的commit信息
![image-20210919220613739](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222014019-665327460.png)
根据自己的情况修改,不修改也行
![image-20210919220723644](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222014255-39529653.png)
修改好:wq保存即可
![image-20210919220806584](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222014447-704392276.png)
备注:这时候如果使用git status查看,会告知你落后于自己远端分支,让你使用git pull合并远程分支,此时还是老样子,忽略该信息即可
![image-20210919220902307](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222014655-296461452.png)
step5:正常变基流程咯,切到master分支,merge brach_a分支即可
git checkout master
git merge branch_a
git push
step6:查看graph
![image-20210919221549447](https://img2020.cnblogs.com/blog/1768648/202109/1768648-20210919222014867-1171685533.png)
备注:有时候会冲突多个commit,这个时候一个commit都会让你解决一次冲突,这个时候不要着急,一个一个解决即可,直到提示successful成功变基到master,再去master上merge就好了。
三、写在最后
-
发现一个问题
在自己的分支上rebase master分支后,使用git status时,有时候会告知你落后于自己远端分支,让你使用git pull合并远程分支,此时忽略该信息即可。
我尝试好几种方式来使自己分支和远端分支同步,结果不是多提交了commit信息,就是产生了merge的交点。所以我一般就直接忽略该分支了,毕竟该分支的功能也完成了。下次开发重新拉出一个新分支开发即可。有办法解决的同学,可告诉我一下。
-
不应该使用rebase的场景
参考另一篇博文https://www.cnblogs.com/rainbow-tan/p/15314711.html