1-介紹 cherry-pick

1-1-cherry-pick 基本用法

cherry-pick (摘櫻桃)

想要複製幾個 commit 並且接在目前的位置(HEAD)下面的時候,這會是一個非常直接的方式。用 cherry-pick 並不複雜,很容易就可以了解。

在 side branch 中,有一些 commit 要複製到 master branch 上,可以透過一個 rebase 來完成(我們之前已經學到了),但是讓我們看看 git cherry-pick 怎麼做。
Git 練習遊戲-調整提交順序-cherry-pick-1
Git 練習遊戲-調整提交順序-cherry-pick-2

1-2-cherry-pick 解題

需要從三個 branch 複製幾個 commit 到 master 下面,你可以從視覺化的目標看到我們需要哪些 commit。
Git 練習遊戲-調整提交順序-cherry-pick-3

Git 練習遊戲-調整提交順序-cherry-pick-4


2-介紹互動式的 rebase

2-1-rebase 介紹

rebase (重新定義分支的參考基準)

當你知道你要複製哪些 commit(而且你也知道他們所對應的 hash 值),那麼 git cherry-pick 很適合你。
但是如果你不知道你要的是哪些 commit 呢? 很幸運的是,git 也有考慮到這個問題喔!我們可以用互動式的 rebase 來做到,當你想要檢查你想要的 commit 的時候,這會是最好的方法。

互動式的 rebase 相當於使用 rebase 這個指令的時候,後面加上一個 -i 的選項。

如果你有包含了這個選項,git 就會打開一個 UI,讓你知道說有哪些 commit 會被複製下來,它也會告訴你它們的 hash 值以及可以讓你知道它們是什麼的訊息。

在”實務上”,UI 會利用一個編輯器(例如 vim)打開一個檔案,對於我們來說,我已經設計了一個有同樣功能的對話視窗。

當互動式的 rebase 的對話視窗打開之後,你就可以做到三件事情:
– 你可以藉由改變這些 commit 在 UI 的位置(在我們的視窗中,可以透過滑鼠去拖拉),來重新排序它們的順序。
– 你可以選擇完全忽略掉某些 commit,可以用滑鼠按一下,使它變暗,就表示你要忽略掉該 commit。
– 最後, 你可以把 commit 合併在一起,但基於某些理由,在我們的關卡裡面並沒有這個功能。

點按 Omit 按鈕,可以指定 HASH 編號的 commit 指定排序後移動復制,以 C3 為例。
Git 練習遊戲_learngitbranching 記錄_3-調整提交順序_2-介紹互動式的 rebase-1
Git 練習遊戲_learngitbranching 記錄_3-調整提交順序_2-介紹互動式的 rebase-2
Git 練習遊戲_learngitbranching 記錄_3-調整提交順序_2-介紹互動式的 rebase-3

2-1-1-git rebase 的概念

git rebase 有點像是要處理 commit 的編輯,可以修改 commit 的內容,另外也可以讓 commit 記錄點不出現 (不是刪除) 或是將 commit 做排序,也可以插接不同的分支進來目前的分支上,也可以說是合併的一種方式。

2-1-2-git rebase 的參數

git rebase -i HEAD~<後退 commit 點數> 要有目前的 HEAD 為第一個 commit 點數,如果要退幾點就寫對應的數值上去,而概念有點像水果果農所用的插支法,把基底的 commit 點 (也就是 HEAD~<後退 commit 點數> 的 commit) 做為取用點,在接到目前所在的分支上,另外也可以直接針對 分支命 進行接合,可以見文章了解 為你自己學 Git-另一種合併方式(使用 rebase)

rebase -i 加上 -i 參數,是合併過去的提交。

輸入完 rebase 指令後,接著會出現像是文件檔要在對應的 commit HASH 編號進行參數設定,預設是 pick (use commit 使用提交點),在遊戲中會出現 Omit/Pick 的按鈕,如果點按下 Omit 之後可以將 commit 做不顯示,另外可以針對 commit 點進行拉動做排序。
而裡面的參數相關用法可以參考 連猴子都能懂的Git入門指南 – 7. 使用 rebase 合併【教學1 使用分支】

2-2-rebase 解題

Git-練習遊戲_learngitbranching-記錄_3-調整提交順序_2-介紹互動式的-rebase-4

目前 HEAD 的在 master 上,需要將 4 個 commit 點做處理 ( 包含目前分支最新的 commit ),所以 HEAD 需要退 4 個。
使用指令 git rebase -i HEAD~4 進入 rebase commit UI 處理 commit,將 c2 點下 Omit 不顯示,另外燃 c4 c5 的位置對換。
Git-練習遊戲_learngitbranching-記錄_3-調整提交順序_2-介紹互動式的-rebase-5

點按下 confoirm 換鍵後送出設定完成解題。
Git-練習遊戲_learngitbranching-記錄_3-調整提交順序_2-介紹互動式的-rebase-6