0%

在工作中學 Git:rebase 指令

在進入公司以前,我都是用 git merge 來合併分支;直到進入公司後,團隊都是用 git rebase 來合併,一開始很不習慣,到最近我才漸漸習慣這種合併方式,因此想把 rebase 指令適用的場景記錄下來,跟大家分享。

什麼是 rebase

rebasemerge 以外的另一種合併方式,它會取出一連串的 commit,「複製」它們,然後把它們接在別的地方。

merge 的差別在於: merge 會產生額外的 commit 來合併兩個分支;而 rebase 則不會有額外的 commit,如果用線圖來表示的話,可以看到用 rebase 來合併分支時,線圖將會呈現一條直線。

這樣一來,我們的 repo 將會有更好看的 commit 紀錄。

這是用 merge 指令來合併的線圖:

Source: Learn Git Branching

這是使用 rebase 指令合併過後的線圖:

Source: Learn Git Branching

使用目的

我在工作上使用 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 了,感覺就應該要繼續講 rebase -i(互動式 rebase),不過就讓我挪到下禮拜再寫吧!因為真的快沒題材了