轉帖:http://hi.baidu.com/configuration/item/97fddeea252818d0eb34c964
有時候使用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天之後。