1、什麼版本回退
版本回退也可以叫回滾。
若修改過的文件,不僅添加到了暫存區,還提交到了本地版本庫,還能撤銷嗎?
已經無法撤銷修改了,但是可以回退到修改前的版本。
版本回退也是撤銷操作的一種,但我更願意和前兩種撤銷操作分開理解。
引用廖雪峯比喻:
你不斷對文件進行修改,然後不斷提交修改到版本庫裏,就好比玩RPG遊戲時,每通過一關就會自動把遊戲狀態存盤,如果某一關沒過去,你還可以選擇讀取前一關的狀態。有些時候,在打Boss之前,你會手動存盤,以便萬一打Boss失敗了,可以從最近的地方重新開始。
Git也是一樣,每當你覺得文件修改到一定程度的時候,就可以“保存一個快照”,這個快照在Git中被稱爲
commit
。一旦你把文件改亂了,或者誤刪了文件,還可以從最近的一個commit
恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失。
2、需要了解兩個知識點
能夠了解是什麼即可。
(1)HEAD是什麼
HEAD也可以稱爲HEAD指針。
Git倉庫初始化之後,會默認創建一個master分支,即主分支。這是Git對版本進行管理的時間線,即Git的每次提交,都會自動把它們串成一條時間線,這條時間線就是一個分支。
如果沒有新建分支,那麼就只有一條時間線,即只有一個分支,master分支(主分支)。在這條master時間線上有很多版本的時間節點(提交commit),而HEAD指針則指向的是當前分支上,剛剛提交的版本時間節點。
如果上面看不太懂的話,就記住:HEAD指針指向分支,分支指向具體commit。所以HEAD指針代表的就是當前工作分支上最新一次的提交。
(具體原理以後會總結,這裏不詳細展開)
(2)HEAD指針用法
上面說了,HEAD指針代表的就是當前工作分支上最新一次的提交。換句話說HEAD
這個詞就等同於當前工作分支上最新一次提交的別名。
HEAD指針可以表示相對位置,有幾種表示方法:
- 單寫
HEAD
,表示當前工作分支的最新提交版本。 - 可以通過
^
表示前一個版本,例如HEAD^
,如要表示前兩個版本,則需要加兩個^
,示例:HEAD^^
,以此類推。 - 但是要選擇之前版本跨度較多的時候,
^
的數量就不是很好數了(書寫可讀性差),此時可以使用~加數字
表示當前版本之前的第幾個版本。例如:HEAD~100
表示爲最新版本的往前第100個版本。 - 當時我們也可以使用
HEAD@{0}
的方式進行表示,HEAD@{0}
等於HEAD
。HEAD@{1}
等於HEAD^
,也就是前一個版本。值的數字越小,表示版本越新,數字越大表示版本越舊。
HEAD指針的作用示意圖:
3、git reflog
命令介紹
git reflog
命令是用來恢復本地錯誤操作很重要的一個命令,他和git log
命令一樣都可以查看本地版本庫的歷史提交信息。
但是不同的是,git reflog
命令能夠查看可引用歷史提交版本。
可引用歷史提交版本,什麼意思?
- 使用
git log
命令只可以查看到HEAD指針及其之前的版本信息,如果版本發生過回退操作,則可能會出現,HEAD指針之後仍存在歷史提交版本的情況,而這些提交版本信息通過git log
命令是看不到的。 - 我們可以通過使用
git reflog
命令,就可查看到所有歷史版本信息。由於查看所有歷史版本信息的目的,大多是爲了進行版本回退或恢復操作所使用,從中找到所需的commit索引,所以該命令被命名爲reflog
,即:引用日誌。
git log
命令與git reflog
命令作用範圍示意圖: