2014-09-26 45 views
1

我們的團隊最近搬到了git,從svn和hg遷移過來。所以,當他們檢查樹的頂端時,根據GUI,他們傾向於檢查特定提交或本地分支,而不是新的跟蹤分支,而不瞭解git的真實工作方式。爲什麼git獨立HEAD存在?

所以我的問題是爲什麼分離HEAD甚至存在?
爲什麼不能默認檢查一個新的分支? (與我有限的git理解)

教育/培訓絕對幫助,但總是有人新來git ...
你們如何管理它?

順便說一句,我知道如何解決它們。我已閱讀了本網站上的許多帖子。
這對於知識共享以及您如何預防或管理更爲重要。

更新:
閱讀下面提供的詳細解釋後,我現在意識到,我的問題應該是「爲什麼檢查出一個新的遠程分支什麼時候混帳給一個分離的頭?」。無論如何,答案會給你一個很好的理解!

回答

5

[...]爲什麼分離的頭甚至還存在? 爲什麼不能默認檢查一個新的分支?

讓我試試下面的比喻。如果你認爲你的Git倉庫作爲一個相冊,它以編年史你的資料庫的歷史...的

  • 你可以把分支機構作爲書籤;他們標記你的歷史中的興趣點,快照你可能會回到,在某個階段......如果只是出於懷舊:)
  • 你可以認爲HEAD引用爲你的一個手指,保持該書在特定頁面上打開。現在

,試想一下,如果你被允許打開的書只有在有已經書籤。這將是非常嚴格和笨重:你必須創建和只是爲了參觀你們的歷史的某些網頁使用許多書籤:

enter image description here

相反,Git會允許你通過這本書輕彈並打開它在你喜歡的任何頁面上。然後,如果您注意到您感興趣的特定快照,則可以隨時爲其創建新的書籤(分支)。

簡而言之,這就是爲什麼detached-HEAD狀態很有用。它允許您檢出任何提交,即使沒有分支當前指向的提交。如果您決定要將新的工作建立在提交的問題上,那麼創建一個指向該提交的新分支是有意義的;但是,否則,創建一個新的分支將是矯枉過正的。


檢查出一個新的遠程分支的時候爲什麼混帳給一個分離的頭?

我猜你可能運行

git checkout <remote-branch> 

,並驚訝,它脫離了HEAD。你需要知道的Git區分遠程跟蹤分支

之間
  • ,這是本地的資源庫,但只是爲了反映了一個分支住在一個偏僻的倉庫看起來像你傳達的最後一次與服務器;你不能在這些分支上工作;和
  • (純粹)地方分支,它可以工作。

如果現在運行

git checkout <remote-branch> 

您與將要創建播放,並且您將在detached- HEAD狀態結束了當地沒有分公司。您可能需要運行

git checkout -b <new-local-branch> <remote-branch> 

改爲。這將創建並檢出指向與遠程分支相同的提交的新本地分支。沒有分開HEAD然後。

+0

感謝您的詳細描述,它真的給了我一個全面的圖畫,我現在對我的問題有了更好的理解,我會更新它。解釋。 – 2014-09-26 08:51:37

0

因爲他們與術語「結帳」混淆。它們在兩個版本控制系統中有不同的含義。

對於您的特定問題,最簡單的消息是「git pull」=「svn checkout」。因此,與其進行結帳並認爲他們試圖從服務器獲取最新版本,他們應該使用'拉'

+0

這不是真的關於那個混亂。這是關於檢查樹的頂端,有時直接得到一個分離的HEAD,取決於你在GUI中如何做。 – 2014-09-26 07:21:54

+0

我明白了,我誤解了你的問題。當我們從SVN轉移到git時,我們強制所有開發人員使用命令行,並且不允許任何第三方GUI工具。通過這樣做,他們必須熟悉git概念,一旦他們有足夠的知識,他們就可以使用任何GUI。 – 2014-09-26 07:55:04

+0

哇!這是一個好主意。不幸的是,我不是老闆:( – 2014-09-26 08:42:03

4

簡而言之,分離的HEAD是您的HEAD引用在除當前分支的頂端之外的某處。

通俗地說,HEAD指向你倉庫中的最新提交;分離的HEAD指向的地方是而不是在您的存儲庫中的最新提交。

它的存在是因爲要回先前提交的非常方便 - 尤其是運行git bisect時候,因爲Git有回去在歷史上最早的「好」辦理登機手續。能夠檢查任意提交以對其執行冒煙測試也很好(如果git bisect太拜占庭),或查看特定發行版本。

默認創建分支是非常混亂的行爲,因爲如果您在自己的存儲庫上工作,或者每個人都在協作並始終向同一分支提交,則沒有太多理由創建分支(儘管這可以導致一些心痛)。

主要的事情要記住:

  • 爲了擺脫一個分離的頭狀態,檢查出當前分支(git checkout master)。例如,這會將您的HEAD指針移動到master的頂端。

  • 要創建新分支,請使用git checkout -b <branch-name>。結賬時的-b標誌表示您希望創建新分支。

  • 要使用服務器更改更新本地存儲庫,請使用git pull。這將檢索任何遠程更改,並推進您的本地分支機構的提示以匹配遠程服務器的提示。

+0

感謝您的詳細解釋,我想我的問題還不夠清楚,我說的是檢查HEAD,我感到困惑的是,當我們通過執行' git checkout branch_name',它會自動給你一個分離的HEAD的權利嗎?你想說明一下嗎? – 2014-09-26 07:19:10

+1

如果'branch_name'是一個現有的分支,'git checkout branch_name'不會*讓你處於分離的'HEAD'狀態。'HEAD'指向'branch_name'。 – Jubobs 2014-09-26 07:32:58

+0

呃..原來'git checkout new_remote_branch'自動給出了一個分離的HEAD,它不會發生在那些現有的本地分支上。我一直在使用GUI太多並沒有意識到這一點對此感到抱歉 – 2014-09-26 08:45:31

0

結帳命令還有另一種常見形式,其他答案沒有提及。

表格1 - 這將檢出一個已經存在的本地分支

git checkout LOCAL_BRANCH 

表格2 - 強制脫離HEAD

git checkout REFERENCE 

在這裏,參考可以是遠程分支引用,一個標籤,沙等等。一個非常常見的錯誤是鍵入git checkout origin/some_branch並沒有意識到會將origin/some_branch設置爲SHA,然後將您置於分離的頭部。

表3 - 檢查出來遠程分支

git checkout REMOTE_BRANCH 

如果 REMOTE_BRANCH不是本地分支的簡單形式,但它是原產有效的分支,Git會創建一個本地分支,設置跟蹤。所以git checkout some_branch如果「origin/some_branch」存在將會起作用。

最後,您可以簽出一個任意的SHA/Ref,並使用git checkout -b LOCAL_BRANCH REF創建一個分支。如果REF恰好是一個遠程分支引用,Git會自動爲您設置跟蹤(在這種情況下,您必須明確地將origin /放在ref名稱中)。因此,git checkout -b my_some_branch origin/somebranch將創建並檢查my_some_branch並啓用跟蹤。

相關問題