找回Git中丟失的Commit

@[git|commit|reflog]

在使用Git的過程中亦歉,有時候會因?yàn)橐恍┱`操作,比如reset俏让、rebase楞遏、merge等。特別是在Commit之后又執(zhí)行了git reset --hard HEAD強(qiáng)制回滾本地記錄以及文件到服務(wù)器版本首昔,導(dǎo)致本地做的修改全部恢復(fù)到Git當(dāng)前分支的服務(wù)器版本寡喝,同時自己的Commmit記錄也消失了。碰到這種情況勒奇,不要慌预鬓,我們在Git上做的任何操作都只是在原來之前的操作上做修改,并且會被記錄下來保存赊颠,也就是說無論你做了什么格二,對于Git來說都可以進(jìn)行回滾操作。

找回Commit###

通過以下例子來了解下具體怎么回滾:

$ git init
$ touch foo.txt
$ echo 'test data' >> 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)在讓我們來重置回第一次提交的狀態(tài):

$ git reset --hard b7057a9
$ git log
* b7057a9 (HEAD, master) initial commit

這看起來我們是丟掉了我們第二次的提交顶猜,本地的修改也消失了,沒有辦法找回來了痘括。但是 reflog 就是用來解決這個問題的长窄。簡單的說,它會記錄所有HEAD的歷史纲菌,也就是說當(dāng)你做 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

同時本地對foo.txt做的修改也回復(fù)回來了椅贱。

PS:這里在提一下另一個找回Commit的操作git cherry-pick 98abc5a,這個操作與上面的reset操作區(qū)別在于后者只是單純的提取98abc5a這個Commit進(jìn)行回滾懂算,如果在b7057a998abc5a之間還有其他的Commit操作,則會忽略中間的這些Commit做的修改庇麦,所以應(yīng)用這個命令有可能會文件的沖突

git reset的具體用法###

git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]
作用:將當(dāng)前分支reset到指定的<commit>或者HEAD(默認(rèn)為最新的一次提交计技,即重設(shè)到最新一次提交之前的版本)

備注:

  • index,執(zhí)行g(shù)it add的操作女器,會對文件創(chuàng)建索引酸役,所有被跟蹤的文件索引會放入index,表示文件被修改待提交
  • working tree,當(dāng)前工作區(qū)涣澡,被修改但未被add的文件贱呐,存儲在工作區(qū)
  • ORIG_HEAD,用于指向前一個操作狀態(tài),每次的commit或者pull或者reset,git 都會把老的HEAD拷貝到.git/ORIG_HEAD入桂,通過對ORIG_HEAD的引用可以指向前一次的操作狀態(tài)

1奄薇、hard(慎用)
重設(shè)index和working tree,所有改變都會被丟棄,包括文件的修改抗愁、新增馁蒂、刪除等操作,并把HEAD指向<commit>蜘腌,
因此通過git log查看版本提交記錄沫屡,被reset的版本記錄會被丟棄,但可以通過git reflog查看

2撮珠、soft
不重設(shè)index和working tree,僅僅將HEAD指向<commit>,表示已經(jīng)commit的文件會取消commit,
通過git status查看沮脖,文件會處于待commit狀態(tài)“Changes to be committed”

3、mixed(默認(rèn))
重設(shè)index,但不重設(shè)working tree,表示已經(jīng)被add的文件芯急,被取消add勺届,
通過git status查看,文件會處于待添加索引狀態(tài) “Changes not staged for commit”

4娶耍、merge
重設(shè)index免姿,重設(shè)working tree中發(fā)生變化的文件,但是保留index和working tree不一致的文件

5榕酒、keep
重設(shè)index胚膊,重設(shè)working tree中發(fā)生變化的文件

記錄的保存問題###

我們前面說到在Git上做的所有操作都被保存到記錄里,一般是從你本地Git庫執(zhí)行clone開始的所有操作都保存了下來奈应,所以不用擔(dān)心很久之前的一些Commit log找不到澜掩,你或許期望去為已刪除的提交設(shè)置一個更長的保存周期购披。例如:
$ git config gc.pruneexpire "30 days"
意思是一個被刪除的提交會在刪除30天后杖挣,且運(yùn)行 git gc 以后,被永久丟棄刚陡。
你或許還想關(guān)掉 git gc 的自動運(yùn)行:
$ git config gc.auto 0
在這種情況下提交將只在你手工運(yùn)行 git gc 的情況下才永久刪除惩妇。

參考鏈接:
一只想跳舞的老鼠
你無法修改Git的歷史記錄
Terry_龍
bolasblack(GitHub)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市筐乳,隨后出現(xiàn)的幾起案子歌殃,更是在濱河造成了極大的恐慌,老刑警劉巖蝙云,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氓皱,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)波材,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門股淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人廷区,你說我怎么就攤上這事唯灵。” “怎么了隙轻?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵埠帕,是天一觀的道長。 經(jīng)常有香客問我玖绿,道長敛瓷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任斑匪,我火速辦了婚禮琐驴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秤标。我一直安慰自己绝淡,他們只是感情好牢酵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般显蝌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骆撇,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天肴裙,我揣著相機(jī)與錄音践宴,去河邊找鬼阻肩。 笑死,一個胖子當(dāng)著我的面吹牛柒室,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播擂仍,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼乡括,長吁一口氣:“原來是場噩夢啊……” “哼盲赊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起递礼,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤栅受,失蹤者是張志新(化名)和其女友劉穎依疼,沒想到半個月后律罢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秘案,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黍少。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡昵济,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斯稳,到底是詐尸還是另有隱情海铆,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布挣惰,位于F島的核電站卧斟,受9級特大地震影響殴边,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜珍语,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一锤岸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧板乙,春花似錦是偷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凡辱,卻和暖如春戒职,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背透乾。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工洪燥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乳乌。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓捧韵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親汉操。 傳聞我的和親對象是個殘疾皇子再来,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容