檢視修改的歷史記錄 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。
小結:
-
HEAD 指向的版本就是當前最新的版本,Git允許我們在版本的歷史之間穿梭,使用命令 git reset --hard commit-id。
-
穿梭前,可以使用 git log 檢視提交歷史,以便確定要回退到哪個版本。
-
要重返未來,使用 git reflog 檢視命令歷史,以便確定要回到未來的哪個版本。
轉自:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000