[教學] git-27 刪除 commit - 討論區

[教學] git-27 刪除 commit

文章瀏覽次數 2797 文章回覆數 0

特種兵

特種兵圖像(預設)

2020-04-14 16:08:04

From:211.23.21.202

先來講一下怎麼調整 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 紀錄,感覺上整份紀錄看起來會比較完整,

我自己的習慣是非必要不會去刪紀錄或資料,全部用新增的方式雖然會比較漸接,

但也保留了所有動作的紀錄,對我來說所有的資料都是無價的,不會隨便去刪他,

特別是與其他伙伴一起協做的話,直接去刪別人的紀錄總覺得不太禮貌。