[英]Why, in some situation does “git checkout origin/branch” result in “detached at <SHA>” instead of “detached at origin/master”?
我正在開發一個足夠大的倉庫,有多個子模塊。 為確保我們在CI過程中處於正確狀態,我們初始化子模塊,
$ git submodule init
$ git submodule sync
$ git submodule update --force
打印出類似的東西,
Synchronizing submodule url for 'android/public'
Synchronizing submodule url for 'ios/public'
...
Submodule path 'android/public': checked out 'asdf1234'
Submodule path 'ios/public': checked out 'bsdf2345'
如果我們然后經過檢查幾個不同的分支,如果我們然后運行
$ for platform in android ios
$ do
$ (cd $platform/public; git fetch --all; git checkout origin/master)
$ done
並使用git branch
檢查這些文件夾,他們都說(HEAD detached at origin/master)
。
但是,如果我們重做頂部的子模塊初始化,並運行
$ for platform in android ios
$ do
$ (cd $platform/public; git fetch --all; git reset --hard origin/master; git checkout origin/master)
$ done
並使用git branch
再次檢查它們,它們顯示為(HEAD detached at <some SHA>)
。
這是我們CI中的遺留過程,因此可以更改,但我仍然想知道為什么運行git checkout origin/master
不會總是導致git branch
顯示在origin/master
處分離的HEAD。
“脫離”字符串僅僅是為了提供信息。 較舊版本的Git 僅使用哈希ID,您只會看到“在<hash>處分離”。
較新版本的Git嘗試記住執行分離的git checkout
命令中的項目,並且如果可以的話,將說“在something_more_informative處分離”。 在這里,您有時會看到detached at origin/master
。 在各種情況下,它們將丟失詳細信息,包括移動當前提交(通過將新提交ID寫入HEAD
,例如,再次使用git checkout
或通過進行新提交)。 在這種情況下的Git的一些較新的版本將開始說,而不是“分離的”,“ 從超然”,並掛在一些額外的信息,無論它是一個哈希ID或名字。 雖然所有較新的Git版本都試圖這樣做,但有些版本會有一些小錯誤,並且無法正確區分“分離”和“分離”。
在這種特殊情況下 - 盡管它的Git版本依賴 - 機會是你的最后一個示例進程導致“ 散列分離”的原因是你的git reset --hard origin/master
通過ID移動到給定的提交,破壞了舊的保留信息,然后你的git checkout origin/master
看到這不是一個移動 ,即你已經在那個ID,所以它不會更新保留的hash-or-name。
如果是這樣的情況下,只需更換git reset --hard origin/master
用git reset --hard
,從而使得隨后git checkout
不 (通常)移動,將改變保留的信息返回姓名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.