分享前陣子新學到的 Git 小技巧,假設我有 Git 分支狀態如下:

從 fetaureA 開了分支 featureX 做了四次 Commit (Commit-X1 ~ Commit-X4),現在想將 featureX 改成從 featureB 分支出來,如下圖:

要在分支上完成這種移花接木動作,需要使用 git rebase --onto <new-commit-id> <orig-commit-id>,以本案例而言,就是 git rebase --onto featureB featureA - 將目前分支的 featureA Commit 位置改接到 featureB Commit 位置。

學會這個技巧,我們就能任意拼接分支,甚至完成一些近乎惡搞的花式操作:
(註:以下剪接操作在實務上應不會發生,純屬展示)

練習一

將 featureX 從 A2 到 X4 這段切下來,接到 B1 後面,變成 A1-A2-B1-A2-X1-X2-X3-X4,A1 是 45ee9596,B1 是 e449cdbb,所以指令為 git rebase --onto e449cdbb 45ee9596

練習二

將 featureX 的 X1 ~ X4 拆成兩截,X3-X4 接到 A2 (featureA 所在位置)後面 、X1-X2 接到 B2 (featureB 所在位置)後面,步驟稍微多一些:

  1. 先在 X2 開個分支,以免 X3 切走後變成無頭分支
    git branch featureZ f3ea9b9f
  2. 將 featureZ (X2 位置) 改成 featureA (A2),X3-X4 接到 A2 後方
    git rebase --onto featureA featureZ
  3. 切換到 featureZ 分支 git checkout featureZ
  4. 將 featureA (A2 位置) 改成 featureB (B2),X1-X2 接到 B2 後方
    git rebase --onto featureB featureA

雖然實務上不太會對分支做這種花式剪接(處理檔案衝突會搞到哭出來吧),但知道工具極限在哪裡,處理疑難雜症時就多一種選擇。

Tips of how to use git rebase --onto to cut and plug branch to any position.


Comments

# by Dxball

rebase 用 interactive 模式可以做更花式的處理 🤣 期待下篇文章

# by STC

我到底看了什麼...這真的是移花接木啊,鬼爆的黑魔法 🤣🤣🤣 動圖很能幫助理解概念,謝謝您用心的文章!!!

# by billllll

但其实疑难杂症偶尔是需要用到这种方法的

Post a comment