git reset - 還原版本
有些情況,你不要某些 commit,想讓版本還原到幾個 commit 前該怎麼做?這時就會用到 git reset
語法了。
想更瞭解該語法的操作,我也附上本章解的範例 GitHub 數據庫,你可以 clone 下來一同操作。
情境介紹
情境一:不想要最新前兩個 commit,想還原到第一個版本。但檔案都想保留
指令如下:
git reset HEAD^^
你會發現 commit 只剩下一個,使用 git log
指令查詢,也只會剩下一個。原本兩個 commit 變更的檔案,都會被退回到工作目錄,等待你處理。
情境二:除了還原兩個版本外,連檔案都不想保留
git reset HEAD^^ --hard
--hard
是 reset 的其中一個參數,表示在還原過程中,commit 裡面的檔案你都要捨棄時,就可使用。使用此指令的話,工作目錄就會是乾淨的狀態,如下圖。
git reset 搭配 HEAD 小教室
HEAD 也就是目前指標位置,^
就是向前一個版本,,兩個 ^^
就是向前推兩個版本,除此之外,用 ~
也是可以的。例如 git reset HEAD~~
,如果向前推進的版本很多,你也可以用數字取代,例如git reset HEAD^2
。
所以 git reset HEAD^2
等於 git reset HEAD~~
。
而 HEAD
較偏向是相對位置移動,如果你有 commit 的 SHA-1 編號時,使用 git reset <SHA-1編號>
也可以。
操作注意
如果你是跟其他開發者遠端協作,盡量不要將已經推到遠端數據庫的版本,進行git reset
後再推上去。
試想如果你的同事推了個版本到遠端數據庫,但你抓下來後用 reset 還原掉他的資料,又 push 更新上去,這樣他的資料就都不見了。
所以使用 git reset
的時機在於,你將遠端數據庫 clone 下來後,在本地自己新增的 commit 可以還原。而遠端數據庫既有的 commit ,就不要再試圖還原。
指令回顧
- 還原前兩個版本:
git reset HEAD^^
- 還原前兩個版本,所有更新檔案都放棄:
git reset HEAD^^ --hard