detached HEAD 詳解
關於HEAD基本內容可以參閱Git HEAD是什麼一章節。
HEAD是一個指標,通常情況下,它指向當前所在分支,而分支又指向一個commit提交。
HEAD並不總指向一個分支,某些時候僅指向某個commit提交,這就形成detached HEAD。
一.產生原因:
(1).使用git checkout指令切換到指定commit提交。
(2).使用git checkout指令切換到遠端分支。
(3).Rebase操作也會產生detached HEAD狀態。
二.狀態分析:
1.git checkout切換到指定commit:
不要把detached HEAD想的很特別,其實就是HEAD指向某個commit提交,而這個提交恰巧沒有被分支指向。
首先看一下當前master分支提交歷史:
[Shell] 純文字檢視 複製程式碼$ git log --oneline
程式碼執行效果截圖如下:
共有四個commit提交,下面通過git checkout命令切換到c2提交:
[Shell] 純文字檢視 複製程式碼$ git checkout 2bc214d
程式碼執行效果截圖如下:
可以見當前HEAD已經指向2bc214d提交,但是此commit提交沒有分支指向它,處於detached HEAD狀態。
下面我們修改一下檔案,然後進行一次新的提交,這時它的表現與普通分支無異,HEAD指標會繼續向前推進。但是HEAD並沒有指向一個分支,也就是新的提交併沒有被分支指向。
[Shell] 純文字檢視 複製程式碼$ git commit -m "detached HEAD"
進行上述提交後,檢視當前狀態:
[Shell] 純文字檢視 複製程式碼$ git status
程式碼執行截圖如下:
可以看到HEAD依然處於detached HEAD狀態。
在detached HEAD狀態提交的commit與普通分支提交commit相比,當切換到其他分支後不容易被找到。
(1).要麼記住提交的sha-1值。
(2).或者通過git reflog查詢。
(3).如果提交長期沒有被再次使用,就會被資源回收機制收回。
如果想要保留這個提交,可以在此提交的基礎上建立一個分支:
[Shell] 純文字檢視 複製程式碼$ git branch newBr
因為HEAD當前指向426ad27提交,上面程式碼與如下等同:
[Shell] 純文字檢視 複製程式碼$ git branch newBr 426ad27
2.git checkout切換到遠端分支:
首先下載遠端分支到本地,程式碼如下:
[Shell] 純文字檢視 複製程式碼$ git clone https://github.com/githubantzone/myGit.git remoteN
下面來檢視一下遠端分支,程式碼如下:
[Shell] 純文字檢視 複製程式碼$ git branch --remote
程式碼執行效果截圖如下:
下面切換到origin/newBr分支,程式碼如下:
[Shell] 純文字檢視 複製程式碼$ git checkout origin/newBr
程式碼執行效果截圖如下:
由此可以看到,更準確的說,detached HEAD狀態是因為HEAD沒有指向"本地"的分支導致。
當然在本地建立與遠端分支對應的本地分支,切換到本地分支自然就不會產生detached HEAD狀態。
克隆遠端分支的時候,Git會自動在本地建立一個master分支來跟蹤origin/master分支,但是不會在本地自動建立其他分支來跟蹤遠端伺服器上除master分支外的其他分支,程式碼如下:
[Shell] 純文字檢視 複製程式碼$ git branch
程式碼執行效果截圖如下:
只在本地自動建立了master分支,下面建立一個本地分支跟蹤origin/newBr,程式碼如下:
[Shell] 純文字檢視 複製程式碼$ git checkout -t origin/newBr
程式碼執行效果截圖如下:
更多遠端分支內容,可以參閱Git遠端分支一章節。
相關文章
- detached HEAD詳解
- git : 修正HEAD detached狀態Git
- Git HEAD詳解Git
- 介面請求 (get、post、head 等) 詳解
- 介面請求(get、post、head等)詳解
- 深度解讀Head First:公式篇公式
- Head
- Git HEADGit
- include "head_file" 和 include <head_file>
- [Original] What's HEAD, FETCH_HEAD and ORIG_HEAD in GitGit
- cmd_sqlplus:set head off and set head onSQL
- [Bash] Head and TailAI
- cypress 的錯誤訊息 - the element has become detached or removed from the domREM
- 【問題解決】property [elasticsearch.version] is missing for plugin [head]ElasticsearchPlugin
- Head 外掛使用
- Linux head命令Linux
- HTML <head>標籤HTML
- git reset --hard HEAD^Git
- PLSQL Developer_v7_sqlplus:set head off and set head onSQLDeveloper
- [20211019]V$DETACHED_SESSION檢視.txtSession
- elasticsearch-head 筆記Elasticsearch筆記
- Head First HTML and CSS (八)HTMLCSS
- Head First Python (一)Python
- HTML head 頭標籤HTML
- HEAD元素de使用 (轉)
- Linux基礎命令---headLinux
- Linux head和tail命令LinuxAI
- ElasticSearch安裝Head外掛Elasticsearch
- Head First ,入門首選
- linux 中head tail 命令LinuxAI
- http協議/cookie詳解/session詳解HTTP協議CookieSession
- Lombok 註解詳解Lombok
- Java註解詳解Java
- Java 註解詳解Java
- Java註解最全詳解(超級詳細)Java
- git-----You have not concluded your merge (MERGE_HEAD exists)解決Git
- 移動前端不得不瞭解的html5 head 頭標籤前端HTML
- Linux中head命令例項Linux