先來講一下怎麼調整 commit 的順序好了。
$ git log --oneline -7
aee4e62 (HEAD -> master) 複製一個 test.py 蓋掉原本的同名檔案
0338589 在 log.txt 加了第三行
9a73d0c 新增 qqoo.txt
13a95ad 刪除 ooqq.txt
316ffbc 在 hello.txt 加入第3行
d78c4ff 刪掉生活班232小時課表--0610.doc 與 abc.txt
d7de1ff 我也加了生活班232小時課表--0610.doc
我想要讓新增的資訊排在一起,修改的資訊排在一起這樣
簡單講就是直接用 rebase -i 然後把順序調一調就好了,
不過 rebase -i 呈現的順序本來就跟 log 相反,這點要注意一下別弄返了:
# 把 rebase 設定在 d7de1ff
$ git rebase -i d7de1ff
pick d78c4ff 刪掉生活班232小時課表--0610.doc 與 abc.txt
pick 316ffbc 在 hello.txt 加入第3行
pick 13a95ad 刪除 ooqq.txt
pick 9a73d0c 新增 qqoo.txt
pick 0338589 在 log.txt 加了第三行
pick aee4e62 複製一個 test.py 蓋掉原本的同名檔案
# 其實就直接把順序搬一搬變這樣
pick d78c4ff 刪掉生活班232小時課表--0610.doc 與 abc.txt
pick 13a95ad 刪除 ooqq.txt
pick 316ffbc 在 hello.txt 加入第3行
pick 0338589 在 log.txt 加了第三行
pick 9a73d0c 新增 qqoo.txt
pick aee4e62 複製一個 test.py 蓋掉原本的同名檔案
# 存檔離開就會自動繼續完成 rebase 作業了
Successfully rebased and updated refs/heads/master.
# 查看一下紀錄
$ git log --oneline -7
9a7c325 (HEAD -> master) 複製一個 test.py 蓋掉原本的同名檔案
610ad12 新增 qqoo.txt
1b697dc 在 log.txt 加了第三行
181dbcc 在 hello.txt 加入第3行
5bbbe37 刪除 ooqq.txt
d78c4ff 刪掉生活班232小時課表--0610.doc 與 abc.txt
d7de1ff 我也加了生活班232小時課表--0610.doc
這邊要提醒一下,順序也不是想怎麼改就怎麼改,記得要注意合理性,
例如還沒新增 ooqq.txt 就不可能去修改這個檔案,檔案都不存在要怎麼修改?
放前面的就是先執行的,放後面的就是後執行的動作,在修改順序時要注意一下。
又如原本先修改某個檔案的 1-3 行,後來又改了 4-6 行,
當我們把這兩個順序對調以後,使用 reset 回到 修改 1-3 行的 commit 後,
因為修改 4-6 行這筆已經被我們挪到修改 1-3 行的前面了,
所以目前處在修改 1-3 行的 commit 時,此時這個檔案的 4-6 行是已經被修改的狀況,
如果沒有調動順序,reset 回來後,後面的 commit 都會暫時消失,所以 4-6 行是還沒修改的狀況,
希望你們可以聽得懂我在說什麼,要注意一下這些小細節就是了。
接著我們刪除 commit
有兩個方法,一是在 rebase -i 中把 pick 改成 drop
二是直接把那行 pick 的 commit 刪掉
# 列出前 5 筆記錄
$ git log --oneline -5
9a7c325 (HEAD -> master) 複製一個 test.py 蓋掉原本的同名檔案
610ad12 新增 qqoo.txt
1b697dc 在 log.txt 加了第三行
181dbcc 在 hello.txt 加入第3行
5bbbe37 刪除 ooqq.txt
# 想把 `1b697dc` 與 `181dbcc` 刪掉
# 先把 rebase 設在 5bbbe37 上
$ git rebase -i 5bbbe37
pick 181dbcc 在 hello.txt 加入第3行
pick 1b697dc 在 log.txt 加了第三行
pick 610ad12 新增 qqoo.txt
pick 9a7c325 複製一個 test.py 蓋掉原本的同名檔案
# 將 pick 改成 drop
# 也可以直接用編輯器把那兩行刪掉
drop 181dbcc 在 hello.txt 加入第3行
drop 1b697dc 在 log.txt 加了第三行
pick 610ad12 新增 qqoo.txt
pick 9a7c325 複製一個 test.py 蓋掉原本的同名檔案
# 存檔離開
Successfully rebased and updated refs/heads/master.
$ git log --oneline -5
762ece1 (HEAD -> master) 複製一個 test.py 蓋掉原本的同名檔案
580aaf0 新增 qqoo.txt
5bbbe37 刪除 ooqq.txt
d78c4ff 刪掉生活班232小時課表--0610.doc 與 abc.txt
d7de1ff 我也加了生活班232小時課表--0610.doc
成功刪除了那兩個 commit 了。
提醒一下,刪除 commit 的意思就是該 commit 所做的動作都不算,所以跟上面的提醒一下要注意相依性就是合理性的問題。
例如你原本新增一個檔案,後來有在修改,結果你把新增該檔案的 commit 刪了,
那肯定會出問題。
另外,還有個指令可以刪除 commit 就是:
git revert HEAD --no-edit
--no-edit
就是不寫 commit 了,但這個指令會自己再新增一筆記錄,該筆記錄是刪除上一個 commit
就像是 merge 會產生 commit 一樣。
感覺上沒有像 reset 那麼強硬,revert 會新增一個 commit 紀錄,感覺上整份紀錄看起來會比較完整,
我自己的習慣是非必要不會去刪紀錄或資料,全部用新增的方式雖然會比較漸接,
但也保留了所有動作的紀錄,對我來說所有的資料都是無價的,不會隨便去刪他,
特別是與其他伙伴一起協做的話,直接去刪別人的紀錄總覺得不太禮貌。