[git] 如何使用 rebase 指令來整理 commit 以及如何推送至遠端

Visits: 2

因為公司專案, commit 非常的亂,要如何使用 rebase 指令來整理 commit

什麼是 rebase?

引用自高見龍大大為你自己學Git:

從字面上來看,「rebase」是「re」加上「base」,翻成中文大概是「重新定義分支的參考基準」的意思。

從文字上很難理解,那我們就透過實作來理解吧。

rebase 指令與實作範例

用法就是 git rebase -i "起始 SHA-1",透過 -i 這個指令,可以透過 vim 編輯器互動式的決定 commits 要怎麼長。而起始 SHA-1 就是決定要從哪個 commits 開始整理。

檔案準備

第一步:創造一個檔案 hello.txt ,內文只有一行的文字 create hello.txt, first commit 並且推送到遠端後,檢查狀態:
file

第二步:在第二行新增 second line in second commit. 並且推送到遠端後檢查狀態:
file

第三步:在第三行新增一行數字 3 並且推送到遠端後檢查狀態:
file

確認一下現在的檔案:
file

開始 rebase

現在,我發現第二次的 commit 沒有改完整,我還要新增 print(n) 在第三行中,那我仿照先前的步驟,直接新增後 commit 就好啦,沒什麼難的麻~
file

隨著越來越多的 commits 看得越來越心煩,此時我們可以利用 rease -i 的技巧來整理我們的 commits ,目標是把第四次的 commit 8e995da 與第二次的 commit f603aae 合併成同一次 commit。輸入 rebase -i a1eb6de ,意思是我要把第一次的 commit a1eb6de 作為起點,重新將後面的分支接上的意思。此時終端機會進入 vim 的畫面,準備 rebase。

git rebase -i a1eb6de

file

這邊要注意的是,由上到下的 commits 是 由舊到新的 ,跟 git log --oneline 的結果由新到舊是顛倒的 (從 commits 的 SHA-1 號碼可以看出來)

藉由修改 commit 的順序與行為(pick, squash, edit…等),達到整理的效果。將第三次 commit 8e995da 整行的文字移動到第二次 commit f603aae 的下一行,並把原來的 8e995da 整行刪除後,將 8e995da 前面的 pick 改為 squash ,pick/squash/edit…等指令的功能在終端機底下都有寫到, squash 意思是把這次的 commit 壓縮到前一次的 commit 中並刪除這次的 commit。換句話說,就是把兩者的 commit 當作一次,這就是我們要的目標。
file

若出現 conflict 衝突,則把衝突修正好後, 執行 git add 後再執行 git rebase --continue

接下來的畫面要輸入融合後的 commit 訊息,同時會列出第一次 commit a1eb6de 與第二次 commit f603aae 的 commit 訊息,我會把原本的通通註解起來,並在第一行輸入新的 commit message: melt: add second line and print(n) in third line together.

file

完成後出現 Successfully rebased and updated refs/heafs/master. ,則表示 rebase 完成,此時可以再輸入一次 git log --oneline 檢查現在的狀態,結果是,若沒問題就可以推送至遠端,完成 rebase。

file

推送到遠端

若執行 git push 到遠端會噴錯,因為 commit 的樹狀已經跟遠端的有所不同了,因此若要成功推送,需強迫推送 (git push -f),強制遠端更新為我現在從 local 推送上去的版本,因此在使用時要非常小心,建議是開一個 branch 執行完所有的修改、 rebase 與強制更新後,再發個 pull request ,確定沒問題後再合併。

About the Author

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You may also like these