有關(guān)Git那些事兒(四)------穿越歷史與未來(lái)

上一小節(jié)我們學(xué)會(huì)了如何修改文件,并提交到Git版本庫(kù)中。我們?cè)倬毩?xí)一次,修改love.txt文件如下:

I love you so much as the mouse like rice.
Do you know?
Every day

之后提交:

git add love.txt
git commit -m "append"

命令行返回如下:

[master 37ae842] append
 1 file changed, 1 insertion(+)

這樣頻繁地修改文件、提交文件到版本庫(kù)的過(guò)程,如同玩單機(jī)版RPG游戲時(shí),我們?cè)诖駼OSS之前會(huì)手動(dòng)存盤(pán),以防萬(wàn)一被殺掉,可以從最近的記錄開(kāi)始。Git也是如此,修改到一定程度可以手動(dòng)保存,利用commit這個(gè)命令。如果文件改亂了,還可以從最近的一個(gè)commit恢復(fù),而不是從頭開(kāi)始。

現(xiàn)在,我們想查找love.txt中一共修改了幾次,我們可以利用git log命令查找歷史。

git log

命令行返回如下信息:

commit 37ae8429ec61ed6e43e5251df9ed729f831e7544 (*HEAD -> master*)
Author: xxlquanrou <xxlquanrou@163.com>
Date:   Sun Jan 6 14:05:41 2019 +0800

    append

commit 664f71e56621d229f2d98da0801aa3b1cf0c91ea
Author: xxlquanrou <xxlquanrou@163.com>
Date:   Sat Dec 29 22:39:30 2018 +0800

    add a sentence

commit b372d91bb9765311ce5d31bb2d1b083902a2244c
Author: xxlquanrou <xxlquanrou@163.com>
Date:   Fri Dec 28 23:26:12 2018 +0800

    a love song

我們從上面的信息中可以知道,共提交了3次修改,最近的一次是append,上一次是add a sentence,第一次是a love song。

友情提示:上面類(lèi)似37ae8429ec61e...的是commit id(版本號(hào)),是SHA1計(jì)算出的非常龐大的數(shù)字,16進(jìn)制表示,具有唯一性。另外,你的跟我的肯定不一樣.

Git中,HEAD相當(dāng)于C語(yǔ)言中的指針,指向當(dāng)前版本,此時(shí)指最新提交的37ae842,上一個(gè)版本是HEAD^,上上一個(gè)版本是HEAD^^,依次類(lèi)推,50個(gè)版本可以寫(xiě)50個(gè)^,不過(guò)不太容易數(shù),可以寫(xiě)成HEAD-50。

現(xiàn)在,把當(dāng)前版本append退回到上上一個(gè)版本a love song,可以使用git reset命令:

git reset --hard HEAD^^

命令行回復(fù)信息如下:

HEAD is now at b372d91 a love song

現(xiàn)在使用cat命令,查看love.txt中的內(nèi)容,是不是回到了版本a love song

cat love.txt

命令行回復(fù):

I love you as the mouse like rice.

果然回到了第一次”遇見(jiàn)“的地方~

我們可以用git log命令查看一下現(xiàn)在版本庫(kù)的情況:

git log

命令行回復(fù)如下:

commit b372d91bb9765311ce5d31bb2d1b083902a2244c (*HEAD -> master*)
Author: xxlquanrou <xxlquanrou@163.com>
Date:   Fri Dec 28 23:26:12 2018 +0800

    a love song

仔細(xì)對(duì)比,發(fā)現(xiàn)中間的兩處修改的”存根“不見(jiàn)了,感覺(jué)像穿越回古代,回不去了!腫么破?

莫急。只要?jiǎng)e手賤將剛才的命令行窗口關(guān)閉,就還有補(bǔ)救的辦法。例如,想找回最近修改的那個(gè)版本apend,先找到它的commit id版本號(hào)37ae84,然后使用git reset —hard命令可以回到現(xiàn)代:

git reset --hard 37ae84

版本號(hào)沒(méi)必要寫(xiě)全,Git可以根據(jù)前面幾位自動(dòng)判斷。

命令行回復(fù)如下:

HEAD is now at 37ae842 append

再次查看love.txt中的內(nèi)容:

cat love.txt

命令行回復(fù)如下:

I love you so much as the mouse like rice.
Do you know?
Every day

哈哈,我胡漢三又回來(lái)啦~

假如,你回退到了某個(gè)版本,關(guān)掉了電腦,過(guò)了幾天又想回到最新的版本,你不知道此版本的commit id,可以使用git reflog命令查看你的每一次命令:

git reflog

命令行回復(fù)如下:

37ae842 (*HEAD -> master*) HEAD@{0}: reset: moving to 37ae84
b372d91 HEAD@{1}: reset: moving to HEAD^^
37ae842 (*HEAD -> master*) HEAD@{2}: commit: append
664f71e HEAD@{3}: commit: add a sentence
b372d91 HEAD@{4}: commit (initial): a love song

從上面可以看到,哪個(gè)版本的id號(hào)都是一目了然的。

現(xiàn)在的你,可以在現(xiàn)在和過(guò)去之間隨意穿梭啦~

課后小結(jié)來(lái)啦:

  1. HEAD指向的是當(dāng)前版本,是一個(gè)指針??梢允褂妹?code>git reset --hard commit_id進(jìn)行版本之間的穿越,也可以使用相對(duì)關(guān)系git reset --hard HEAD^進(jìn)行版本之間的轉(zhuǎn)換。
  2. 想回到過(guò)去,使用git log指令可以查看歷史命令,確定想要回到歷史哪個(gè)版本(針對(duì)當(dāng)前版本來(lái)說(shuō))。
  3. 想穿越到未來(lái),使用git reflog命令可以查看歷史命令,確定要回到未來(lái)的哪個(gè)版本(針對(duì)當(dāng)前版本來(lái)說(shuō))。
  4. 查看當(dāng)前版本中文件內(nèi)容,使用指令cat <fileName>。

本小節(jié)到此結(jié)束,預(yù)知后事如何,且聽(tīng)下回分解哈~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容