Git 中 HEAD 遊離的緣由與解決方法

什麼是 HEAD

Git 中的 HEAD 能夠理解爲指針,指向當前倉庫所處的分支。通常在有 Git 管理的目錄下打開 Git 終端都能在當前路徑的尾巴上,看到所處的分支名。 html

還能夠在命令行中輸入 cat .git/HEAD 查看當前 HEAD 指向哪裏。 git

通常它指向當前工做目錄所在分支的最新提交。 github

如何形成 HEAD 的遊離狀態

通常咱們會使用命令 git checkout <branch_name> 來切換分支,HEAD 就會移動到指定的分支上。 ide

可是,若是咱們使用的是 git checkout <commit_id> 來切換到指定的某一次提交,HEAD 就會處於「detached」狀態,也就是遊離狀態ui

HEAD 遊離狀態的利弊

好處: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…

相關文章
相關標籤/搜索