Hits: 395
因為公司專案, 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
並且推送到遠端後,檢查狀態:
第二步:在第二行新增 second line in second commit.
並且推送到遠端後檢查狀態:
第三步:在第三行新增一行數字 3
並且推送到遠端後檢查狀態:
確認一下現在的檔案:
開始 rebase
現在,我發現第二次的 commit 沒有改完整,我還要新增 print(n)
在第三行中,那我仿照先前的步驟,直接新增後 commit 就好啦,沒什麼難的麻~
隨著越來越多的 commits 看得越來越心煩,此時我們可以利用 rease -i
的技巧來整理我們的 commits ,目標是把第四次的 commit 8e995da
與第二次的 commit f603aae
合併成同一次 commit。輸入 rebase -i a1eb6de
,意思是我要把第一次的 commit a1eb6de
作為起點,重新將後面的分支接上的意思。此時終端機會進入 vim 的畫面,準備 rebase。
git rebase -i a1eb6de
這邊要注意的是,由上到下的 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 當作一次,這就是我們要的目標。
若出現 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.
完成後出現 Successfully rebased and updated refs/heafs/master.
,則表示 rebase 完成,此時可以再輸入一次 git log --oneline
檢查現在的狀態,結果是,若沒問題就可以推送至遠端,完成 rebase。
推送到遠端
若執行 git push
到遠端會噴錯,因為 commit 的樹狀已經跟遠端的有所不同了,因此若要成功推送,需強迫
推送 (git push -f
),強制遠端更新為我現在從 local 推送上去的版本,因此在使用時要非常小心,建議是開一個 branch 執行完所有的修改、 rebase 與強制更新後,再發個 pull request ,確定沒問題後再合併。
Comments