logo-yuki

Yuki

Blog

ブログ

cover-working-with-dependent-branches

Branch A 還在 Code review,但我接下來的功能要延續 A 做,怎麼辦?

難道是…叫同事看快點?不不不別呀 w

總之先從 A 開一個 Branch B 出來吧! 那 A 被 merged 到 dev 後,B 該怎麼辦? 又如果 A 需要修改,改好才 merged,要對 B 做什麼事情才能繼續開發嗎?

好的,這是在「多人協作」的開發過程中,常見的情境,關鍵字可以搜「git stacked / dependent branches」之類的就有。

該怎麼辦其實很簡單,以下一步步手把手教。

沒錯,先從 A 開一個 Branch B 就對了。

因為 B 的功能依賴 A,當然就得以 A 為起點開一個分支出來,才能延續著做。

# 1. 確定自己是在 A,如果不是,切到 A
git switch branch-a

# 2. (Optional) 只是個習慣,確保 A 是最新版本
git pull origin branch-a

# 3. 從 A 建立並切到 B
git switch -c branch-b

如此一來就能先安心繼續趕工做 B,同事也能依照自己的步調幫你 Code review,皆大歡喜。

狀況① ーー A 無事通過 Review 被 merged 到 dev 之後,B 該怎麼辦?

好的,一旦 A 被合併進主要分支(就假設是 dev 吧),A 的使命其實就完成了。像我現在待的團隊是用 GitLab,還有設定 merged 後就自動把 origin A 砍了呢。

此時 B 的「基底」就不應該再是 A,而該是已經包含了 A 內容的 dev。

所以,需要做的動作是「變基」,把 B 的起點從 A 搬到到最新的 dev 上,沒錯 -- 就是要用 git rebase 了啦!

# 1. 確定自己是在 dev,如果不是,切到 dev
git switch dev

# 2. 把最新的 dev 拉下來
git pull origin dev

# 3. 切回 B
git switch branch-B

# 4. 執行 rebase 移花接木
git rebase dev

講一下這邊 git rebase dev 的內部運作過程。

雖然說是「移花接木」,但過程是怎麼移、怎麼接的?

來個視覺化理解:

  • Rebase 前
---o---o---o (dev)
            \
             ---A1---A2 (branch-a)
                       \
                        ---B1---B2 (branch-b)
  • A 被 merged 進 dev 後
---o---o---o---A1'---A2' (dev)
            \
             ---A1---A2 (branch-a) 這個分支其實已經沒用了
                       \
                        ---B1---B2 (branch-b) B 的基礎還是舊 commit
  • 執行
  1. 首先
  2. 再來
  3. 然後
  4. 最後
---o---o---o---A1'---A2' (main)
                           \
                            ---B1'---B2' (branch-B) <- 乾淨!

執行完成後,B 的歷史紀錄會變乾淨,就像是直接從最新的 dev 開出來的一樣。

狀況② ーー A 在 Review 過程中有修改,修改後才 merged,B 該怎麼辦?

其實和上面的處理方式完全一樣

可能會遇到的困難 ーー 衝突

如果在 A 的修改中,動到了你 B 分支也改過的同一行程式碼,rebase 過程會暫停,並提示你哪些檔案有衝突。

這很正常,不用慌張,你就乖乖認命解衝突吧。

蛤?你說不知道怎麼解衝突?那我以後再寫一篇文 w

總結

  1. 先從 A 開 B 分支。
  2. 等待 A 合併後,將 B rebase 到 dev,這是標準且乾淨的做法。能確保 B 包含所有最新的程式碼,包括 A 的最終修改,並讓 Git 歷史線圖保持整潔。
  3. 可以和 review A 分支的同事說一聲,讓他知道你正在基於 A 開發 B,這樣大家互相心裡有數、有個照應,「菠菜法則」有興趣可以了解一下。
  4. 即使 A 還沒合併,也可以偶爾將 B rebase 到 A 的最新進度上 (git rebase branch-a),隨時同步 A 的修改,避免最後差距太大產生巨大衝突。
© 2024 yuki16bit