場景
在很多時候,我們想復原代碼,這個時候,我們想到了
git reset
的使用,但是復原并不是想象中那麼全能,能夠讓你滾來滾去。在你復原前後,你都需要保持謹慎,别掉進一些大坑中
使用
首先,我們經常要復原的場合應該是上一次,可以使用以下的指令既可。
git reset HEAD^
那麼上上次,還有上上次呢?不錯,直接多加上
^
号
git reset HEAD^^
// 復原到上上次
git reset HEAD^^^
// 復原到上上上次
當然也可以通過以下的形式:
git reset HEAD~1
git reset HEAD~2
git reset HEAD~3
這樣跟上面的效果是一樣的。
但是問題來了,我們現在在項目中發現一個嚴重的bug,但是這個是很久之前的了,中間我們送出了很多次,難道我們要去寫好好個
^
麼?或者要一個個的去數??
當然不需要,這個時候,我們可以通過commit_id去復原,可以通過指令
git log
或者
git relog
檢視各個送出的commit_id,找到我們想要復原的位置的commit_id,複制。使用以下指令進行復原。
git reset [commit_id]
如果我們不行復原所有的檔案,那麼我們可以怎麼做呢?很簡單,就在上面的指令後面加上我們要復原的檔案所在路徑既可。即:
git reset [commit_id] [file]
其實我們上面提到的隻是
git reset
的三種形式之一(預設形式--mixed)
git reset的三種形式的差別
- --mixed.回退一個版本,而且會将暫存區的内容和本地已經送出的内容全部恢複到未暫存的狀态。不影響原來的本地檔案,未送出的也不會受到影響。這個就是它的好處,你可以不用先送出,再復原。但是個人強烈建議你還是送出之後再去復原。
- --sort.回退一個版本,不清空暫存區,将已送出的内容恢複到暫存區,不影響原來本地的檔案(未送出的也不受影響)
- --hard.回退一個版本,清空暫存區,将已送出的内容的版本恢複到本地,本地的檔案也将被恢複的版本替換,這裡就是為什麼建議你在復原之前務必先送出自己的代碼,這是非常有必要的(因為你如果使用--hard的話,同時你又沒有送出的話,真的回不去了,别問我為什麼知道)