有時候 commit 比較雜亂就必須合併一下,我們來看這個例子:
# 看最近 4 個 commit
$ git log --oneline -4
82cdfe4 (HEAD -> master) 在 hello.txt 加入第3行
41c1423 又刪掉 abc.txt
b0a547f 刪掉生活班232小時課表--0610.doc
d7de1ff 我也加了生活班232小時課表--0610.doc
我們想把那兩個刪掉檔案的 commit 合併成一個就好。
所以我們把 rebase 設定在更早一個的 commit 上:
注意,rebase -i
的交互模式顯示 commit 由上到下是由舊到新,
與我們的 log 顯示是由新到舊剛好相反。
$ git rebase -i d7de1ff
pick b0a547f 刪掉生活班232小時課表--0610.doc
pick 41c1423 又刪掉 abc.txt
pick 82cdfe4 在 hello.txt 加入第3行
我們列出前半部需要修改的部分就好,第一個和第二個 commit 需要合併,
所以我們在第二個 commit 把 pick 改成 quash 然後存檔離開
pick b0a547f 刪掉生活班232小時課表--0610.doc
squash 41c1423 又刪掉 abc.txt
pick 82cdfe4 在 hello.txt 加入第3行
接下來就看你是要把本來的註解掉再重新寫一個,還是用修改的方式變成你要的內容存檔離開。
[detached HEAD d78c4ff] 刪掉生活班232小時課表--0610.doc 與 abc.txt
Date: Sat Apr 4 17:26:07 2020 +0800
2 files changed, 2 deletions(-)
delete mode 100644 abc.txt
delete mode 100644 "\347\224\237\346\264\273\347\217\255232\345\260\217\346\231
\202\350\252\262\350\241\250--0610.doc"
Successfully rebased and updated refs/heads/master.
再觀察一下 log 是不是我們要的結果:
$ git log --oneline -4
316ffbc (HEAD -> master) 在 hello.txt 加入第3行
d78c4ff 刪掉生活班232小時課表--0610.doc 與 abc.txt
d7de1ff 我也加了生活班232小時課表--0610.doc
fa03700 在 abc.txt 加了一行
因為兩個 commit 合併成一個,所以看起來比一開始多顯示了一筆 commit 資訊。
這邊附上 rebase -i
互動模式的其他指令說明:
- pick:保留该 commit 不變動
- reword:保留该 commit,但需要修改该 commit 的訊息
- edit:保留该 commit 但要停下来修改该提交的內容,不只是訊息而已
- squash:将该 commit 和前一个 commit 合并
- fixup:将该 commit 和前一个 commit 合并,但不需要保留该提交的訊息
- exec:执行 shell 命令
- drop:丢弃该 commit