1. 程式人生 > >檢視修改的歷史記錄 git log 命令 和 返回上一次修改版本 git reset 、git reflog(五)

檢視修改的歷史記錄 git log 命令 和 返回上一次修改版本 git reset 、git reflog(五)

上一篇,已經學會了修改檔案,然後再把修改檔案提交到Git版本庫,now,再重複執行一次,修改index.html檔案如下:

然後執行新增、提交:

像這樣,你不斷對檔案進行修改,然後不斷提交修改到版本庫裡,每次修改到一定程度時,再提交;一旦你把檔案改亂了,或者誤刪了檔案,還可以從最近的一個commit恢復,然後繼續工作,而不是把之前的修改記錄全部丟失。

那麼現在,回顧一下 index.html 檔案一共有幾個版本被提交到Git版本庫裡:

版本1:first commit ;

版本2:change content ;

版本3:add content;

在實際工作中,若修改了N次該檔案時,在Git中,我們可以使用命令  git log 檢視歷史修改記錄,如下:

命令 git log 表示從最近到最遠的提交日誌

從上圖可知看到3次提交,最近一次是add content,其次change content,最後是first commit;

如果要簡化資訊,還可以在命令 git log 後面新增 --pretty=oneline 引數,如下圖:

友情提示:黃色一大串類似67b46cl....的是 commit id (版本號),在找回某個版本時,發揮巨大作用;

為什麼 commit id 需要用這麼一大串數字表示呢?因為Git是分散式的版本控制系統,後面我們還要研究多人在同一個版本庫裡工作,如果大家都用1,2,3……作為版本號,那肯定就衝突了。


目前index.html檔案的版本為add content;如果說要返回上一個版本change content,怎麼做呢?

第一:首先,Git必須知道當前版本是哪個版本,在Git中,我們可以用 HEAD 表示當前版本(如上圖所示),那麼上一個版本為:HEAD^  。再上上一個版本為:HEAD^^ 。以此類推,100個版本的話就有100個^,表示為 HEAD~100

現在,我們把當前版本add content 返回到上一個版本 change content,使用 git reset 命令,如下所示:

--hard 引數?後面再講。

此時檔案index.html裡的內容變回了版本change content,使用 命令 cat

檢視:

第二:我們可以繼續地返回上一個版本 first commit ;但是現在用命令 git log 檢視現在版本庫的記錄:

從上圖可知,最新的那個版本 add content 沒有顯示,怎麼辦? 

只要上面的命令列視窗還沒有被關掉,你就可以滾動滑輪順著往上一直找。

找到最新版本 add content 的 commit id 是 67b46c1c4...。接下來就可以指定回到某個最新的版本,如下圖:

如上圖所示,現在又回到了最新的版本了。

那麼 commit id (版本號)不需要寫全,開頭前幾位(最好大於5位數),Git 就會自動去尋找且不易重複其他 版本號;


第三:萬一返回到某個版本,關掉了電腦,第二天早上就後悔了,想恢復到新版本怎麼辦?

找不到新版本的commit id (版本號)怎麼辦?

當你用 $ git reset --hard HEAD^ 返回到版本change content 時,再想恢復到最新版本 add content ,就必須要找到 add content 版本的commit id(版本號), Git 提供了一個命令 git reflog 用來記錄你的每一次命令,如下:

上圖可知:add content 的 commit id(版本號)是 67b46c1。


小結:

  1. HEAD 指向的版本就是當前最新的版本,Git允許我們在版本的歷史之間穿梭,使用命令 git reset --hard commit-id。 

  2. 穿梭前,可以使用 git log 檢視提交歷史,以便確定要回退到哪個版本。

  3. 要重返未來,使用 git reflog 檢視命令歷史,以便確定要回到未來的哪個版本。

轉自:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000