Git 中的 HEAD 能夠理解爲指針,指向當前倉庫所處的分支。通常在有 Git 管理的目錄下打開 Git 終端都能在當前路徑的尾巴上,看到所處的分支名。 html
還能夠在命令行中輸入 cat .git/HEAD
查看當前 HEAD 指向哪裏。 git
通常它指向當前工做目錄所在分支的最新提交。 github
通常咱們會使用命令 git checkout <branch_name>
來切換分支,HEAD 就會移動到指定的分支上。 ide
可是,若是咱們使用的是 git checkout <commit_id>
來切換到指定的某一次提交,HEAD 就會處於「detached」狀態,也就是遊離狀態。 ui
好處:HEAD 處於遊離狀態時,開發者能夠很方便地在歷史版本之間互相切換,好比要回到某次提交,只須要 checkout
對應的 commit id
或者 tag
名便可。命令行
弊端:若在該基礎上進行了提交,則會新開一個「匿名分支」;也就是說咱們的提交是沒法可見保存的,一旦切換到別的分支,原遊離狀態之後的提交就不可追溯了。 3d
下面咱們來看看實際的例子。指針
首先查看一下當前的分支狀況,當前只有一個 master
分支: 日誌
再來查看下近期的 log
日誌: code
而後假設我要回到倒數第二條 commit 時候的狀態,順便查看下本地工做目錄狀態以及分支狀態:
能夠看到,我尚未修改和提交的狀況下,切換完成就給我新建了一個分支,而且指明 HEAD
正遊離在 2772886
的 <commit id>
上。
若是不作任何修改,想回到 master
分支,直接 git checkout master
便可,而不要 checkout master 主幹所對應的 <commit id>
。
順利回到主幹的話,HEAD 的遊離狀態會取消,原臨時遊離分支也會消失。
若是是在遊離狀態作了修改和提交,則:
切換會 master 分支時,在遊離狀態所作的修改和提交沒法追溯:
其實很簡單,剛纔有仔細看終端提示的同窗就會知道,在切換到遊離狀態的時候應該新建一個分支,而後咱們全部的操做修改和提交都會保存到該分支,HEAD 也就指向了該分支最新提交的 commit id 處,而不會再處於遊離狀態。
當在新建分支上修改提交完畢時,就切換回 master 分支,將原分支合併到 master 分支就萬事大吉了。 到這裏就再也不操做演示了,你們都懂。
部分圖片摘自《圖解Git》: marklodato.github.io/visual-git-…
文章參考《Git 手冊》: git-scm.com/docs/git-ch…