detached HEAD state


1 detached HEAD state指的是什么

正常情況下,HEAD指向一個branch,而branch又指向一個commit。

detached HEAD state指的是HEAD指針沒有指向任何的branch,比如說它指向了一個commit。比如我在某次commit處設置了一個tagXXX,然后我git checkout tagXXX,這個時候,我的HEAD就會指向這個commit。

2 detached HEAD state時我能做什么

我也可以提交,這個時候,commit鏈就在git checkout這個commit的基礎上展開,但是如果直接離開到一個branch上的話,這些commits就會被當成garbage,被git garbage collection routine所回收。但是,我們也可以保留這些commits,又下面三種方式:

$ git checkout -b foo ,創建一個branch指向這個commit鏈,然后HEAD指向這個branch,於是HEAD就不是處於detached state。
$ git branch foo,創建一個branch指向這個commit鏈,但是HEAD還是處於detached state。
$ git tag foo,創建一個tag指向這個commit鏈,HEAD還是處於detached state。

3 為什么git checkout origin/XXX遠程分支的時候會讓HEAD進入detached state?

因為HEAD不能指向遠程分支,它只能指向本地的某個commit或者本地分支。當"git checkout 遠程分支",HEAD就會直接指向遠程分支指向的commit了,HEAD指向commit就會進入detached HEAD state。

 

這個時候可以

git checkout -b web-zach --track
HEAD就恢復正常,並且local brach web-zach就會跟蹤遠程分支origin/web-zach。

 

當我git checkout [remote branch]了之后,出現了"detached HEAD state",然后我去看HEAD文件里面是什么,cat .git/HEAD,輸出直接是一個commit id,即

af7c2b39936019e386189a0bc80f5c85db637e2e。

我git checkout -b new-branch remote-branch -t之后,cat .git/HEAD,輸出是一個分支,如下:

ref: refs/heads/strategy-pattern-and-sort,這個分支並且track了對應的遠程分支。

 
        

4 detached HEAD state的危害

一旦出現detached HEAD state,切換分支之后,提交很可能就丟失了,被git回收了。因此要盡量避免出現這個狀態。

遇到bug,要到一個老的commit版本去看一下,可以在這個commit的基礎上新建一個branch,問題解決了之后刪除即可。

git checkout -b new-branch-name commit

5 git checkout的本質

"git checkout branch-name"在於告訴git自己想要在哪個版本上工作,執行了這條命了之后,git會把這個版本的文件都放在working copy文件夾中。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM