Skip to main content

[Git] git-rebase

info

這篇筆記主要參考 Larry Lu 所寫的送 PR 前,使用 Git rebase 來整理你的 commit 吧!

git-base,我們先看到官方文件的解釋

git-rebase - Reapply commits on top of another base tip

從上可知,git-rebase 的概念是,我們要根據一個基點去調整 commits,接著就跟著實作吧!

首先,我們下載他提供的範本

git clone https://github.com/Larry850806/rebase-demo

pick 選擇 commit

下載完範本,可以先透過git log --oneline,檢查版本號(commit ID),首先先開啟 rebase 的互動模式git rebase -i,根據題意操作,是將Add file 3移到最下面

git rebase -i 4a16df // Init的版本號

會有五筆 commits,這邊需要使用 vim 的指令,我們先複製第三筆yy(複製該行)->刪除第三筆dd(刪除該行)->貼上第三筆在最後p(在游標位置貼上)

vim syntax: https://www.warp.dev/terminus/vim-copy-paste

pick 2a72a71 Add file1
pick 747f10f Add file2
pick 298c2f7 Add file3
pick 66643bc Add file4
pick a7559a9 Add file5

然後就會變成

pick 2a72a71 Add file1
pick 747f10f Add file2
pick 66643bc Add file4
pick a7559a9 Add file5

pick 298c2f7 Add file3

最後透過:wq(save and quit)就可以完成目標,可以再透過git log --oneline檢查,或著是git reset --hard ORIG_HEAD回復成 ORIG_HEAD 的狀態。

drop 刪除 commit

一樣進入互動模式git rebase -i 4a16df,在要刪除的 commit 前面改成drop,這題是要刪除第四跟第五個 commit

將插入的位置移到第四行,按下dw刪除後面的單字,在按下i進入 insert 模式,輸入dropexc離開 insert 模式,重複上面動作,更新第五行,最後輸入:wq儲存,就可以完成目標。

pick 2a72a71 Add file1
pick 747f10f Add file2
pick 298c2f7 Add file3
drop 66643bc Add file4
drop a7559a9 Add file5

reword 修改 message

相同的步驟,將要修改的那行前面的關鍵字改為reword

pick 2a72a71 Add file1
pick 747f10f Add file2
pick 298c2f7 Add file3
reword 66643bc Add file4
pick a7559a9 Add file5

squash 合併 commit

將關鍵字改為squash,會跟上一個 commit 合併,然後將兩筆 commit message 刪掉,改成新的 commit message。

edit 編輯 commit(拆分)

在要編輯的 commit 前,改關鍵字為edit

pick 2a72a71 Add file1
pick 747f10f Add file2
edit b19b0e5 Add file3-4
pick 8c96f52 Add file5

:wq儲存之後,rebase 會在edit的階段暫停,停在b19b0e5 Add file3-4的 commit,我們透過指令git reset --mixed HEAD~1會將file3file4退出 staged 區域,參考以下說明圖

Git Reset Explained – How to Save the Day with the Reset Command

由說明圖可知,git reset --mixed仍會在本地端保有檔案,但是 git 並沒有記錄到 STAGING AREA 裡面,這時候,回到目標,分別將file3file4加入到 stage,再提交commit,最後輸入git rebase --continue讓 rebase 繼續,完成目標

git reset --mixed HEAD~1

git add file3
git commit -m "Add file3"

git add file4
git commit -m "Add file4"

git rebase --continue

如此以來,就透過文章的五個練習更多瞭解了git-rebase的應用。

結論

在本地端,要使得 commit 變得工整,可以使用git-rebase做調整,但是在雲端共用的時候,可以使用git-merge,在不修改歷史紀錄的情況、會影響到其他人的紀錄下,做合併的修改。

參考資料