零、使用場景
正常合並分支,我們一般都用git merge命令,這樣子會導致git的graph有交叉,而不是一條直線。
交叉是這樣子的(當三個人在master上拉出分支開發,然后在master上進行merge操作時)

為了開發清爽,保證沒有交叉點,這個時候可以使用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圖形是這樣子的。

④先用branch4來進行測試,使用rebase的方式合並到master分支上。
真正的rebase步驟(合並branch4分支到master分支)
step1:先切到branch4分支
git checkout branch4

step2:使用rebase命令把自己的commit信息復制到master分支上
git rebase master

備注:執行了rebase master后使用git status時,會出現該信息,告知你落后於branch4分支,讓你使用git pull合並遠程分支,此時忽略該信息即可。
step3:切換到master分支
git checkout master

step4:在master上merge branch4分支
git merge branch4

step5:推到遠程master分支
git push

step6:查看graph

備注:此時可以看到,已經合並了branch4上的commit信息到master上了,且沒有交叉出現,大功告成。
⑤同樣的步驟,把branch5和branch6都合並到master上。
⑥查看graph

備注:此時可以看到,已經合並了branch5和branch6上的commit信息到master上了,且沒有交叉出現,大功告成。
⑦把branch4,branch5,branch6刪除后,再看看實際的graph效果(一條線,清爽)

二、git rebase解決沖突
當使用rebase命令時,會出現沖突的情況,我們來模擬一下解決沖突的過程。
①在master分支上,添加一個文件為master_file_for_rebase_test.txt文件,文件內容為AAA

②在master上checkout出一個分支branch_a
③在master上修改文件master_file_for_rebase_test.txt,內容為BBB

④此時branch_a分支中master_file_for_rebase_test.txt文件內容還依舊是AAA,我們來修改為CCC

⑤此時的graph是這樣子的

⑥這個時候在branch_a分支rebase master分支
git checkout branch_a
git rebase master

此時提示我們沖突文件是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

step2:手動編輯文件,選擇要保存的內容,我們要保存CCC,所以我們把BBB刪了,手動修改后是這樣子的

step3:使用git add命令保存更改
git add master_file_for_rebase_test.txt

step4:運行git rebase --continue繼續變基(這里不要使用git commit命令,只需要add即可)
git rebase --continue
此時會出現vim窗口,讓你修改那個變基沖突的commit信息

根據自己的情況修改,不修改也行

修改好:wq保存即可

備注:這時候如果使用git status查看,會告知你落后於自己遠端分支,讓你使用git pull合並遠程分支,此時還是老樣子,忽略該信息即可

step5:正常變基流程咯,切到master分支,merge brach_a分支即可
git checkout master
git merge branch_a
git push
step6:查看graph

備注:有時候會沖突多個commit,這個時候一個commit都會讓你解決一次沖突,這個時候不要着急,一個一個解決即可,直到提示successful成功變基到master,再去master上merge就好了。
三、寫在最后
-
發現一個問題
在自己的分支上rebase master分支后,使用git status時,有時候會告知你落后於自己遠端分支,讓你使用git pull合並遠程分支,此時忽略該信息即可。
我嘗試好幾種方式來使自己分支和遠端分支同步,結果不是多提交了commit信息,就是產生了merge的交點。所以我一般就直接忽略該分支了,畢竟該分支的功能也完成了。下次開發重新拉出一個新分支開發即可。有辦法解決的同學,可告訴我一下。
-
不應該使用rebase的場景
參考另一篇博文https://www.cnblogs.com/rainbow-tan/p/15314711.html