昨天寫代碼的時候,誤刪了一個文件。今天發現的時候,commit 已經 push 到版本庫了。本想用 git reset
回退版本,找回文件后重新提交。但是想起 Git 是一個版本控制系統哎,直接從版本庫里 checkout 出某個文件的歷史版本不就好了?
想法挺好,但是很久沒用這個功能,自己已經不記得具體的命令了。於是查了下手冊,把和 checkout 歷史版本有關的幾個命令都記錄一下。
從某個歷史版本創建新的分支
在 Git 中從當前分支創建並檢出新分支的命令是
git checkout -b name-of-new-branch
這個命令實際上是
git checkout -b name-of-new-branch current-branch
的簡寫形式。也就是說,當我們不指定 checkout 起點時,Git 默認從當前活動分支開始創建新的分支。
Git 的每個提交都有一個 SHA1 散列值(Hash 值)作為 ID。我們可以在 checkout
命令中使用這些 ID 作為起點。比如:
git checkout -b name-of-new-branch 169d2dc
這樣,Git 的活動分支會切換到 name-of-new-branch
這個分支上,而它的內容與 169d2dc
這個分支一致。
注意:SHA1 的散列值有 40 個字母,相當長。所以 Git 允許我們在不引起歧義的情況下,使用散列值的前幾位作為縮寫。
提示:你也可以用 git branch name-of-new-branch 169d2dc
來創建一個歷史分支,而不切換到該分支。
將某個歷史版本 checkout 到工作區
首先說明,這樣做會產生一個分離的 HEAD 指針,所以個人不推薦這么做。
如果我們工作在 master
分支上,希望 checkout 到 dev
分支上,我們會這么做:
git checkout dev
這里 dev
實際上是一個指針的別名,其本質也是一個 SHA1 散列值。所以,我們很自然地可以用
git checkout <sha1-of-a-commit>
將某個歷史版本 checkout 到工作區。
將某個文件的歷史版本 checkout 到工作區
大多數時候,我們可能只需要對某一個文件做細小的修補,因此只 checkout 該文件就行了,並不需要操作整個 commit 或分支。
上一節我們介紹了如何將某個歷史版本完整地 checkout 到工作區。實際上,我們只需要在上一節的命令之后加上需要 checkout 的文件即可。
git checkout <sha1-of-a-commit> </path/to/your/file>
當然,有時候你需要將某個文件的歷史版本 checkout 出來,並以一個新的名字保存。這時候可以這么做:
git checkout <sha1-of-a-commit>:</path/to/your/file> </new/name/of/the/file>