[轉]恢復 git reset -hard 的誤操做

轉帖:http://hi.baidu.com/configuration/item/97fddeea252818d0eb34c964git

 

有時候使用Git工做得當心翼翼,特別是涉及到一些高級操做,例如 reset, rebase 和 merge。甚至一些很小的操做,例如刪除一個分支,spa

我都擔憂數據丟失。 it

 

不 久以前,我在作一些大動做(rebasing)以前,我老是備份整個版本庫,以防萬一。直到最近我才發現git的歷史記錄是不可修改的,io

也就是說你不能更改任何已經發生的事情。你作的任何操做都只是在原來的操做上修改。也就是說,即便你刪除了一個分支,修改了一個提交, ast

或者強制重置,你仍然能夠回滾這些操 做。數據

 

讓咱們來看一些例子: touch

 

$ git initvi

$ touch foo.txt備份

$ git add foo.txtco

$ git commit -m "initial commit"

 

$ echo 'new data' >> foo.txt

$ git commit -a -m "more stuff added to foo"

 

你如今看git的歷史記錄,你能夠看到兩次提交:

$ git log

* 98abc5a (HEAD, master) more stuff added to foo

* b7057a9 initial commit

 

如今讓咱們來重置回第一次提交的狀態:

$ git reset --hard b7057a9

$ git log

* b7057a9 (HEAD, master) initial commit

 

這看起來咱們是丟掉了咱們第二次的提交,沒有辦法找回來了。可是 reflog 就是用來解決這個問題的。簡單的說,它會記錄全部HEAD的歷史,

也就是說當你作 reset,checkout等操做的時候,這些操做會被記錄在reflog中。

 

$ git reflog

b7057a9 HEAD@{0}: reset: moving to b7057a9

98abc5a HEAD@{1}: commit: more stuff added to foo

b7057a9 HEAD@{2}: commit (initial): initial commit

 

因此,咱們要找回咱們第二commit,只須要作以下操做:

$ git reset --hard 98abc5a

 

再來看一下 git 記錄:

$ git log

* 98abc5a (HEAD, master) more stuff added to foo

* b7057a9 initial commit

 

因此,若是你由於reset等操做丟失一個提交的時候,你老是能夠把它找回來。除非你的操做已經被git當作垃圾處理掉了,通常是30天之後。

相關文章
相關標籤/搜索