2.2.版本回退

現(xiàn)在嚎货,你已經(jīng)學(xué)會了修改文件橘霎,然后把修改提交到Git版本庫,現(xiàn)在殖属,再練習(xí)一次姐叁,修改readme.txt文件如下:

Git is a distributed version control system.
Git is free software distributed under the GPL.

使用git status來查看工作區(qū)狀態(tài):

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

使用git diff查看修改內(nèi)容

$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 013b5bc..99e0e11 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
 Git is a distributed version control system.
-Git is free software.
\ No newline at end of file
+Git is free software distributed under the GPL.
\ No newline at end of file

然后嘗試提交:

$ git add readme.txt
$ git commit -m "append GPL"
[master f26bebe] append GPL
 1 file changed, 1 insertion(+), 1 deletion(-)

Git中,每當(dāng)你覺得文件修改到一定程度的時候,就可以“保存一個快照”外潜,這個快照在Git中被稱為commit原环。一旦你把文件改亂了,或者誤刪了文件处窥,還可以從最近的一個commit恢復(fù)嘱吗,然后繼續(xù)工作,而不是把幾個月的工作成果全部丟失碧库。

現(xiàn)在柜与,我們回顧一下readme.txt文件一共有幾個版本被提交到Git倉庫里了:

版本1:wrote a readme file

Git is a version control system.
Git is free software.

版本2:add distributed

Git is a distributed version control system.
Git is free software.

版本3:append GPL

Git is a distributed version control system.
Git is free software distributed under the GPL.

當(dāng)然了,在實(shí)際工作中嵌灰,我們腦子里怎么可能記得一個幾千行的文件每次都改了什么內(nèi)容弄匕,不然要版本控制系統(tǒng)干什么。版本控制系統(tǒng)肯定有某個命令可以告訴我們歷史記錄沽瞭,在Git中迁匠,我們用git log命令查看:

$ git log
commit f26bebebde86df093b03733d26d495a4180ecea0 (HEAD -> master)
Author: yzl <789397573@qq.com>
Date:   Mon Aug 13 10:00:21 2018 +0800

    append GPL

commit 3a61c78a51426a7aa6fb15aebeee3ab9ac2b6657
Author: yzl <789397573@qq.com>
Date:   Mon Aug 13 09:30:43 2018 +0800

    add distributed

commit e0d63ef5ed32aa6747668dbf8867d7c03b96dd90
Author: yzl <789397573@qq.com>
Date:   Tue Aug 7 09:06:34 2018 +0800

    wrote a readme file

git log命令顯示從最近到最遠(yuǎn)的提交日志,我們可以看到3次提交驹溃,最近的一次是append GPL城丧,上一次是add distributed,最早的一次是wrote a readme file豌鹤。

如果嫌輸出信息太多亡哄,看得眼花繚亂的,可以試試加上--pretty=oneline參數(shù):

$ git log --pretty=oneline
f26bebebde86df093b03733d26d495a4180ecea0  (HEAD -> master) append GPL
3a61c78a51426a7aa6fb15aebeee3ab9ac2b6657  add distributed
e0d63ef5ed32aa6747668dbf8867d7c03b96dd90 wrote a readme file

需要友情提示的是布疙,你看到的一大串類似f26bebebd...的是commit id(版本號)蚊惯,和SVN不一樣,Git的commit id不是1灵临,2截型,3……遞增的數(shù)字,而是一個SHA1計算出來的一個非常大的數(shù)字儒溉,用十六進(jìn)制表示宦焦,而且你看到的commit id和我的肯定不一樣,以你自己的為準(zhǔn)顿涣。為什么commit id需要用這么一大串?dāng)?shù)字表示呢波闹?因?yàn)镚it是分布式的版本控制系統(tǒng),后面我們還要研究多人在同一個版本庫里工作涛碑,如果大家都用1舔痪,2,3……作為版本號锌唾,那肯定就沖突了锄码。

每提交一個新版本夺英,實(shí)際上Git就會把它們自動串成一條時間線。如果使用可視化工具查看Git歷史滋捶,就可以更清楚地看到提交歷史的時間線:


如果我們準(zhǔn)備把readme.txt回退到上一個版本痛悯,也就是add distributed的那個版本,怎么做呢重窟?

首先载萌,Git必須知道當(dāng)前版本是哪個版本,在Git中巡扇,用HEAD表示當(dāng)前版本扭仁,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^厅翔,上上一個版本就是HEAD^^乖坠,當(dāng)然往上100個版本寫100個 ^ 容易數(shù)不過來,所以寫成HEAD~100刀闷。

現(xiàn)在熊泵,我們要把當(dāng)前版本append GPL回退到上一個版本add distributed,就可以使用git reset命令:

$ git reset --hard HEAD^
HEAD is now at 3a61c78 add distributed

--hard參數(shù)有啥意義甸昏?這個后面再講顽分,現(xiàn)在你先放心使用。

看看readme.txt的內(nèi)容是不是版本add distributed:

$ cat readme.txt
Git is a distributed version control system.
Git is free software.

果然被還原了施蜜。

還可以繼續(xù)回退到上一個版本wrote a readme file卒蘸,不過且慢,然我們用git log再看看現(xiàn)在版本庫的狀態(tài):

commit 3a61c78a51426a7aa6fb15aebeee3ab9ac2b6657 (HEAD -> master)
Author: yzl <789397573@qq.com>
Date:   Mon Aug 13 09:30:43 2018 +0800

    add distributed

commit e0d63ef5ed32aa6747668dbf8867d7c03b96dd90
Author: yzl <789397573@qq.com>
Date:   Tue Aug 7 09:06:34 2018 +0800

    wrote a readme file

最新的那個版本append GPL已經(jīng)看不到了翻默!好比你從21世紀(jì)坐時光穿梭機(jī)來到了19世紀(jì)缸沃,想再回去已經(jīng)回不去了,腫么辦冰蘑?

辦法其實(shí)還是有的,只要上面的命令行窗口還沒有被關(guān)掉村缸,你就可以順著往上找祠肥,找到那個append GPL的commit id是f26bebebde...,于是就可以指定回到未來的某個版本

$ git reset --hard f26bebebde
HEAD is now at f26bebe append GPL

版本號沒必要寫全梯皿,前幾位就可以了仇箱,Git會自動去找。當(dāng)然也不能只寫前一兩位东羹,因?yàn)镚it可能會找到多個版本號剂桥,就無法確定是哪一個了。

再小心翼翼地看看readme.txt的內(nèi)容:

$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.

果然属提,我胡漢三又回來了权逗。

Git的版本回退速度非趁朗快,因?yàn)镚it在內(nèi)部有個指向當(dāng)前版本的HEAD指針斟薇,當(dāng)你回退版本的時候师坎,Git僅僅是把HEAD從指向append GPL:



改為指向add distributed:



然后順便把工作區(qū)的文件更新了。所以你讓HEAD指向哪個版本號堪滨,你就把當(dāng)前版本定位在哪胯陋。

現(xiàn)在,你回退到了某個版本袱箱,關(guān)掉了電腦遏乔,第二天早上就后悔了,想恢復(fù)到新版本怎么辦发笔?找不到新版本的commit id怎么辦盟萨?

在Git中,總是有后悔藥可以吃的筐咧。當(dāng)你用$ git reset --hard HEAD^回退到add distributed版本時鸯旁,再想恢復(fù)到append GPL,就必須找到append GPL的commit id量蕊。Git提供了一個命令git reflog用來記錄你的每一次命令:

$ git reflog
f26bebe (HEAD -> master) HEAD@{0}: reset: moving to f26bebebde86df093b03733d26d495a4180ecea0
3a61c78 HEAD@{1}: reset: moving to HEAD^
f26bebe (HEAD -> master) HEAD@{2}: commit: append GPL
3a61c78 HEAD@{3}: commit: add distributed
e0d63ef HEAD@{4}: commit (initial): wrote a readme file

從輸出可知铺罢,append GPL的commit id是f26bebe,現(xiàn)在残炮,你又可以乘坐時光機(jī)回到未來了韭赘。

小結(jié):

1.HEAD指向的版本就是當(dāng)前版本,因此势就,Git允許我們在版本的歷史間穿梭泉瞻。使用命令git reset --hard commit_id
2.穿梭前,用git log可以查看提交歷史苞冯,以便確定回退到哪個版本袖牙。
3.要重返未來,用git reflog查看命令歷史舅锄,找到相應(yīng)commit_id確定回到未來哪個版本鞭达。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市皇忿,隨后出現(xiàn)的幾起案子畴蹭,更是在濱河造成了極大的恐慌,老刑警劉巖鳍烁,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叨襟,死亡現(xiàn)場離奇詭異,居然都是意外死亡幔荒,警方通過查閱死者的電腦和手機(jī)糊闽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門梳玫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人墓怀,你說我怎么就攤上這事汽纠。” “怎么了傀履?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵虱朵,是天一觀的道長。 經(jīng)常有香客問我钓账,道長碴犬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任梆暮,我火速辦了婚禮服协,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啦粹。我一直安慰自己偿荷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布唠椭。 她就那樣靜靜地躺著跳纳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贪嫂。 梳的紋絲不亂的頭發(fā)上寺庄,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機(jī)與錄音力崇,去河邊找鬼斗塘。 笑死,一個胖子當(dāng)著我的面吹牛亮靴,可吹牛的內(nèi)容都是我干的馍盟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼茧吊,長吁一口氣:“原來是場噩夢啊……” “哼贞岭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饱狂,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤曹步,失蹤者是張志新(化名)和其女友劉穎宪彩,沒想到半個月后休讳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尿孔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年俊柔,在試婚紗的時候發(fā)現(xiàn)自己被綠了筹麸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡雏婶,死狀恐怖物赶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情留晚,我是刑警寧澤酵紫,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站错维,受9級特大地震影響奖地,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赋焕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一参歹、第九天 我趴在偏房一處隱蔽的房頂上張望闹司。 院中可真熱鬧恕出,春花似錦告喊、人聲如沸康谆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽潜叛。三九已至絮爷,卻和暖如春飒炎,著一層夾襖步出監(jiān)牢的瞬間埋哟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工郎汪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赤赊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓煞赢,卻偏偏與公主長得像抛计,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子照筑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

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

  • 轉(zhuǎn)自: http://www.liaoxuefeng.com/wiki/0013739516305929606dd...
    CoderJohnhao閱讀 10,389評論 1 3
  • Git常用語法 [TOC] Git簡介 描述 ? Git(讀音為/g?t/吹截。)是一個開源的分布式版本控制系統(tǒng),...
    君惜丶閱讀 3,529評論 0 13
  • 現(xiàn)在凝危,你已經(jīng)學(xué)會了修改文件波俄,然后把修改提交到Git版本庫,現(xiàn)在蛾默,再練習(xí)一次懦铺,修改readme.txt文件如下: G...
    yshenhn閱讀 178評論 0 0
  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git,從https:/...
    落魂灬閱讀 12,665評論 4 54
  • 直到格格走的那一刻支鸡,我才適切的感受到冬念,我的大一上個學(xué)期結(jié)束了趁窃,勢不可擋的結(jié)束了。 時間凹鼻啊醒陆!你總是在...
    迨冰未泮兮閱讀 192評論 0 0