昨天寫代碼的時候,誤删了一個檔案。今天發現的時候,commit 已經 push 到版本庫了。本想用 <code>git reset</code> 回退版本,找回檔案後重新送出。但是想起 Git 是一個版本控制系統哎,直接從版本庫裡 checkout 出某個檔案的曆史版本不就好了?
想法挺好,但是很久沒用這個功能,自己已經不記得具體的指令了。于是查了下手冊,把和 checkout 曆史版本有關的幾個指令都記錄一下。
在 Git 中從目前分支建立并檢出新分支的指令是
這個指令實際上是
的簡寫形式。也就是說,當我們不指定 checkout 起點時,Git 預設從目前活動分支開始建立新的分支。
Git 的每個送出都有一個 SHA1 散列值(Hash 值)作為 ID。我們可以在 <code>checkout</code> 指令中使用這些 ID 作為起點。比如:
這樣,Git 的活動分支會切換到 <code>name-of-new-branch</code> 這個分支上,而它的内容與 <code>169d2dc</code> 這個分支一緻。
注意:SHA1 的散列值有 40 個字母,相當長。是以 Git 允許我們在不引起歧義的情況下,使用散列值的前幾位作為縮寫。
提示:你也可以用 <code>git branch name-of-new-branch 169d2dc</code> 來建立一個曆史分支,而不切換到該分支。
首先說明,這樣做會産生一個分離的 HEAD 指針,是以個人不推薦這麼做。
如果我們工作在 <code>master</code> 分支上,希望 checkout 到 <code>dev</code> 分支上,我們會這麼做:
這裡 <code>dev</code> 實際上是一個指針的别名,其本質也是一個 SHA1 散列值。是以,我們很自然地可以用
将某個曆史版本 checkout 到工作區。
大多數時候,我們可能隻需要對某一個檔案做細小的修補,是以隻 checkout 該檔案就行了,并不需要操作整個 commit 或分支。
上一節我們介紹了如何将某個曆史版本完整地 checkout 到工作區。實際上,我們隻需要在上一節的指令之後加上需要 checkout 的檔案即可。
當然,有時候你需要将某個檔案的曆史版本 checkout 出來,并以一個新的名字儲存。這時候可以這麼做: