在進入公司以前,我都是用 git merge
來合併分支;直到進入公司後,團隊都是用 git rebase
來合併,一開始很不習慣,到最近我才漸漸習慣這種合併方式,因此想把 rebase
指令適用的場景記錄下來,跟大家分享。
什麼是 rebase
rebase
是 merge
以外的另一種合併方式,它會取出一連串的 commit,「複製」它們,然後把它們接在別的地方。
跟 merge
的差別在於: merge
會產生額外的 commit 來合併兩個分支;而 rebase
則不會有額外的 commit,如果用線圖來表示的話,可以看到用 rebase
來合併分支時,線圖將會呈現一條直線。
這樣一來,我們的 repo 將會有更好看的 commit 紀錄。
這是用 merge
指令來合併的線圖:
這是使用 rebase
指令合併過後的線圖:
使用目的
我在工作上使用 rebase 的目的是,為了在遠端合併時不發生衝突,需要事先讓本地端的 feature branch 的前段長得跟 develop branch 一樣,而在後段多出自己新增的 commit。
指令
git rebase 要合併的分支
使用情境
feature/add-addon-categories
分支是從 develop
分支分出來的,在該分支做了一些開發後,準備要推到遠端、發 PR 給團隊成員 code review。在這之前,需要先 rebase
上游分支(develop
),確保在遠端合併到 develop
時不會發生衝突。
此時,就可以在 feature/add-addon-categories
中下這個指令:git rebase develop
衝突
rebase
的過程中跟 merge
一樣可能會遇到衝突,解衝突時一個 commit 要解一次,衝突解完後要依循以下步驟:git add .
⇒ git rebase --continue
⇒ 下一個衝突 ⇒ 重複。
至於遇到衝突可以怎麼解,我就留到之後再分享啦~不然我已經快沒梗了
狀況題
rebase 完 push 失敗,git 提示先 pull
如果你的分支曾經推到遠端過,然後中間又 rebase
其他分支,那之後再 push
時,Git 就會叫你 pull
遠端下來再推一次。
這是因為 Git 此時判定本地端的內容比遠端的內容還舊,所以才會出現這種提示,然而,此時不能 pull
,不然程式碼又會變成舊的!
所以這時候的解法就是要用 git push --force-with-lease
,硬推上去更新遠端內容。
參考資料
- 使用 rebase 合併【教學1 使用分支】 | 連猴子都能懂的Git入門指南 | 貝格樂(Backlog)
- 另一種合併方式(使用 rebase) - 為你自己學 Git | 高見龍
- Learn Git Branching
都已經講到 rebase
了,感覺就應該要繼續講 rebase -i
(互動式 rebase),不過就讓我挪到下禮拜再寫吧!因為真的快沒題材了