轉(zhuǎn)帖:http://hi.baidu.com/configuration/item/97fddeea252818d0eb34c964
有時(shí)候使用Git工作得小心翼翼,特別是涉及到一些高級(jí)操作,例如 reset, rebase 和 merge啤咽。甚至一些很小的操作宪祥,例如刪除一個(gè)分支墓卦,我都擔(dān)心數(shù)據(jù)丟失十酣。
不 久之前灾杰,我在做一些大動(dòng)作(rebasing)之前馅闽,我總是備份整個(gè)版本庫(kù)飘蚯,以防萬(wàn)一馍迄。直到最近我才發(fā)現(xiàn)git的歷史記錄是不可修改的,也就是說(shuō)你不能更 改任何已經(jīng)發(fā)生的事情局骤。你做的任何操作都只是在原來(lái)的操作上修改攀圈。也就是說(shuō),即使你刪除了一個(gè)分支峦甩,修改了一個(gè)提交赘来,或者強(qiáng)制重置,你仍然可以回滾這些操 作穴店。
讓我們來(lái)看一些例子:
$ git init
$ touch foo.txt
$ git add foo.txt
$ git commit -m "initial commit"
$ echo 'new data' >> foo.txt
$ git commit -a -m "more stuff added to foo"
你現(xiàn)在看git的歷史記錄撕捍,你可以看到兩次提交:
$ git log
- 98abc5a (HEAD, master) more stuff added to foo
- b7057a9 initial commit
現(xiàn)在讓我們來(lái)重置回第一次提交的狀態(tài):
$ git reset --hard b7057a9
$ git log
- b7057a9 (HEAD, master) initial commit
這看起來(lái)我們是丟掉了我們第二次的提交,沒有辦法找回來(lái)了泣洞。但是 reflog 就是用來(lái)解決這個(gè)問(wèn)題的忧风。簡(jiǎn)單的說(shuō),它會(huì)記錄所有HEAD的歷史球凰,也就是說(shuō)當(dāng)你做 reset狮腿,checkout等操作的時(shí)候,這些操作會(huì)被記錄在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
再來(lái)看一下 git 記錄:
$ git log
- 98abc5a (HEAD, master) more stuff added to foo
- b7057a9 initial commit
所以甩挫,如果你因?yàn)閞eset等操作丟失一個(gè)提交的時(shí)候贴硫,你總是可以把它找回來(lái)。除非你的操作已經(jīng)被git當(dāng)做垃圾處理掉了伊者,一般是30天以后英遭。