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詳解Git
- 介面請求 (get、post、head 等) 詳解
- 介面請求(get、post、head等)詳解
- [20211019]V$DETACHED_SESSION檢視.txtSession
- [Original] What's HEAD, FETCH_HEAD and ORIG_HEAD in GitGit
- Head
- Git HEADGit
- include "head_file" 和 include <head_file>
- Linux head命令Linux
- [Bash] Head and TailAI
- 【問題解決】property [elasticsearch.version] is missing for plugin [head]ElasticsearchPlugin
- cypress 的錯誤訊息 - the element has become detached or removed from the domREM
- HTML <head>標籤HTML
- Head First Python (一)Python
- git reset --hard HEAD^Git
- Head 外掛使用
- git-----You have not concluded your merge (MERGE_HEAD exists)解決Git
- Head First HTML and CSS (八)HTMLCSS
- elasticsearch-head 筆記Elasticsearch筆記
- Linux基礎命令---headLinux
- 有關Weak Head Normal FormORM
- Linux中head命令例項Linux
- elasticSearch head 查詢報錯Elasticsearch
- Linux命令4-head / tailLinuxAI
- http協議/cookie詳解/session詳解HTTP協議CookieSession
- head 標籤裡有什麼?
- <head>標籤裡有什麼?
- Git ORIG_HEAD用法介紹Git
- 安裝elasticsearch-head外掛Elasticsearch
- HTML-head頭部淺析HTML
- elasticsearch-head離線安裝Elasticsearch
- 《Head First 設計模式》:策略模式設計模式
- Elasticsearch Head外掛使用小結Elasticsearch
- How to solve the "ambiguous argument 'origin..HEAD'"...
- Java註解最全詳解(超級詳細)Java
- Java註解詳解Java
- Lombok 註解詳解Lombok