關於 web service, unity, blogger 等軟體工程筆記

Rebase a fork using TortoiseGit

Edit icon 沒有留言
Rebase a fork using TortoiseGit

工作需求,要將 Fork 專案 (某個 Repository 的副本),對於原始的 Repository,做一次 Rebase 更新基底程式碼,簡單紀錄概念以及操作步驟。

想法概念

下面兩張圖解釋一切,希望 Master 後續的版本更新(Commits),能讓 Feature branch 也能使用的到。

範例 Branches 示意圖

Branches 範例示意圖

Rebase 更新後的 Branches 示意圖

Feature 使用 Git Rebase 更新後的示意圖,其中*為 Rebase Commits

做法可以想法是,計算 Feature branch 上的新 Commits,全部收集起來,然後一個一個 Recommit 到 Master branch 上。

而這次的所執行的更新,Master 是之前 Fork 其他專案的 Master branch,稱為 upstream,Feature 則是目前正在工作的 Master branch。

操作步驟

首先使用 CommandLine,進入到操作 Repository 資料夾,手動新增遠端 upstream branch。這一個遠端 upstream,是之前的 git fork repository。

cd c:\example
git remote add upstream siyuan@git.twsiyuan.com.tw/example.git

在開始執行 Rebase 之前,養成好習慣先更新到最新的資料,當前的 branch feature 要 pull,遠端 upstream branch 也使用 fetch 指令更新 。

git pull "origin"
git fetch upstream

接下來執行 Rebase command,但這步驟不在 CommandLine 中執行 git rebase upstream/master,而改用 TortoiseGit Rebase,是因為 TortoiseGit 有準備一個可愛的 GUI 介面。

使用 Windows context-menu 開啟 TotoriseGit Rebase

使用 Windows context-menu 開啟 TotoriseGit Rebase

TotoriseGit 設定 Rebase 的 upstream branch

在 TotoriseGit Rebase 介面中,設定 upstream

TotoriseGit Rebase GUI

TotoriseGit 所提供的 Rebase GUI 介面

按下 Start Rebase 直接開始。另外可以針對特定 Commit 使用四種不同的方式進行 Recommit,分別是 Pick, Squash, Edit, 以及 Skip。這四個方式的差異,用以下圖解釋。

範例 Branches 示意圖

範例 Branches 示意圖,其中 Master 有三個 Commits,待會針對 Commit B 選擇不同的 Rebase 方式

Pick B,預設值,表示這個 Commit 將會正常 Commit

Squash B,該 Commit 與前一次 Commit 合併 Commit

Edit B,該 Commit 修改其 Message 後再 Commit

Skip B,該 Commit 放棄 Commit 不要了

將結果上傳到 Remote

最後執行強制 Push 將 Rebase 後的結果上傳到遠端,並且覆蓋原本的 master branch。

git push remote master --force

這樣覆蓋是很暴力,可能會導致其他同仁目前的編輯出錯,工作中的 Master branch 沒辦法與遠端 Rebase Master branch 合併。

因此在執行 Rebase 之前,得先通知大家做好準備,要求大家先執行 Push,編輯中的檔案先丟在 Stash。待 Rebase 後的 branch 覆寫 remote 後,再請大家重抓資料,並 Switch 到該 branch 再進行作業了。

Reference

沒有留言: