git reset - 還原版本

洧杰 已發佈 2019-11-17

有些情況,你不要某些 commit,想讓版本還原到幾個 commit 前該怎麼做?這時就會用到 git reset 語法了。

想更瞭解該語法的操作,我也附上本章解的範例 GitHub 數據庫,你可以 clone 下來一同操作。

情境介紹

images

情境一:不想要最新前兩個 commit,想還原到第一個版本。但檔案都想保留

指令如下:

git reset HEAD^^

你會發現 commit 只剩下一個,使用 git log 指令查詢,也只會剩下一個。原本兩個 commit 變更的檔案,都會被退回到工作目錄,等待你處理。
images

情境二:除了還原兩個版本外,連檔案都不想保留

git reset HEAD^^ --hard

--hard 是 reset 的其中一個參數,表示在還原過程中,commit 裡面的檔案你都要捨棄時,就可使用。使用此指令的話,工作目錄就會是乾淨的狀態,如下圖。

images

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

關於筆者

暱稱:洧杰

介紹:六角學院校長,熱愛分享與交流的前端工程師,目前專注於兼容桌面/移動網頁前端開發,期間已協助數百位平面設計師,網頁設計師導入標準網頁設計。