簡體   English   中英

為什么,在某些情況下,“git checkout origin / branch”會導致“分離” <SHA> “而不是”在原點/主人處脫離“?

[英]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/mastergit reset --hard ,從而使得隨后git checkout (通常)移動,將改變保留的信息返回姓名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM