版本回退
現(xiàn)在,你已經(jīng)學(xué)會(huì)了修改文件,然后把修改提交到Git版本庫(kù),現(xiàn)在,再練習(xí)一次,修改readme.txt文件如下:
i am gblfy i am yuxin然后,【工作區(qū)】-【暫存區(qū)】-【本地倉(cāng)庫(kù)】嘗試提交:
修改readme.txt內(nèi)容如下:
提交到本地倉(cāng)庫(kù),【工作區(qū)】-【暫存區(qū)】-【本地倉(cāng)庫(kù)】嘗試提交:
版本1:第1次提交
版本2:第2次提交
i am yuxin版本3:第3次提交
i am gz版本控制系統(tǒng)肯定有某個(gè)命令可以告訴我們歷史記錄,在Git中,我們用git log命令查看:
git loggit log命令顯示從最近到最遠(yuǎn)的提交日志,我們可以看到3次提交,最近的一次是第3次提交,上一次是第2次提交,最早的一次是第1次提交。
如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上--pretty=oneline參數(shù):
git log --pretty=oneline
每提交一個(gè)新版本,實(shí)際上Git就會(huì)把它們自動(dòng)串成一條時(shí)間線。如果使用可視化工具查看Git歷史,就可以更清楚地看到提交歷史的時(shí)間線:
好了,現(xiàn)在我們啟動(dòng)時(shí)光穿梭機(jī),準(zhǔn)備把readme.txt回退到上一個(gè)版本,也就是第2次提交的那個(gè)版本,怎么做呢?
首先,Git必須知道當(dāng)前版本是哪個(gè)版本,在Git中,用HEAD表示當(dāng)前版本,也就是最新的提交7ff6778…(注意我的提交ID和你的肯定不一樣),上一個(gè)版本就是HEAD^,上上一個(gè)版本就是HEAD^^,當(dāng)然往上100個(gè)版本寫(xiě)100個(gè)^比較容易數(shù)不過(guò)來(lái),所以寫(xiě)成HEAD~100。
現(xiàn)在,我們要把當(dāng)前版本第3次提交回退到上一個(gè)版本第2次提交,就可以使用git reset命令:
git reset --hard HEAD^
--hard參數(shù)有啥意義?這個(gè)后面再講,現(xiàn)在你先放心使用。
看看readme.txt的內(nèi)容是不是版本第2次提交:
cat readme.txt
果然被還原了。
還可以繼續(xù)回退到上一個(gè)版本第1次提交,不過(guò)且慢,然我們用git log再看看現(xiàn)在版本庫(kù)的狀態(tài):
git log最新的那個(gè)版本第3次提交已經(jīng)看不到了!好比你從21世紀(jì)坐時(shí)光穿梭機(jī)來(lái)到了19世紀(jì),想再回去已經(jīng)回不去了,腫么辦?
辦法其實(shí)還是有的,只要上面的命令行窗口還沒(méi)有被關(guān)掉,你就可以順著往上找啊找啊,找到那個(gè)第3次提交的commit id是7ff6778...,于是就可以指定回到未來(lái)的某個(gè)版本:
git reset --hard 7ff6778e
版本號(hào)沒(méi)必要寫(xiě)全,前幾位就可以了,Git會(huì)自動(dòng)去找。當(dāng)然也不能只寫(xiě)前一兩位,因?yàn)镚it可能會(huì)找到多個(gè)版本號(hào),就無(wú)法確定是哪一個(gè)了。
再小心翼翼地看看readme.txt的內(nèi)容:
cat readme.txt
果然,我胡漢三又回來(lái)了。
Git的版本回退速度非???#xff0c;因?yàn)镚it在內(nèi)部有個(gè)指向當(dāng)前版本的HEAD指針,當(dāng)你回退版本的時(shí)候,Git僅僅是把HEAD從指向第:3次提交
┌────┐ │HEAD│ └────┘│└──> ○ 第3次提交│○ 第2次提交│○ 第1次提交改為指向第2次提交
┌────┐ │HEAD│ └────┘││ ○ 第3次提交│ │└──> ○ 第2次提交│○ 第1次提交然后順便把工作區(qū)的文件更新了。所以你讓HEAD指向哪個(gè)版本號(hào),你就把當(dāng)前版本定位在哪。
現(xiàn)在,你回退到了某個(gè)版本,關(guān)掉了電腦,第二天早上就后悔了,想恢復(fù)到新版本怎么辦?找不到新版本的commit id怎么辦?
在Git中,總是有后悔藥可以吃的。當(dāng)你用$ git reset --hard HEAD^回退到第2次提交版本時(shí),再想恢復(fù)到第3次提交,就必須找到第3次提交的commit id。Git提供了一個(gè)命令git reflog用來(lái)記錄你的每一次命令:
git reflog
終于舒了口氣,從輸出可知,第3次提交的commit id是7ff6778,現(xiàn)在,你又可以乘坐時(shí)光機(jī)回到未來(lái)了。
小結(jié)
現(xiàn)在總結(jié)一下:
HEAD指向的版本就是當(dāng)前版本,因此,Git允許我們?cè)诎姹镜臍v史之間穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個(gè)版本。
要重返未來(lái),用git reflog查看命令歷史,以便確定要回到未來(lái)的哪個(gè)版本。
總結(jié)
- 上一篇: Centos7 Docker 目录挂载_
- 下一篇: 把字符串按照某几个字符切割成数组