2016-05-29 69 views
1

我一直進入分離狀態的狀態。我不知道爲什麼,我不知道它是什麼。如何避免在git中進入獨立頭部狀態?

每次我試圖從這個狀態恢復,我丟失了一些文件(從最後一次提交我做了脫離頭狀態)。

是否有可能完全避免這種狀態或它是由設計?

+1

'混帳reflog'是你的朋友。 – AD7six

+0

避免'git checkout sha1'。這裏sha1可以是HEAD,FETCH_HEAD。還有一些其他情況導致HEAD狀態分離。如果你確切地知道你正在使用哪個分支,可以保持分離的HEAD狀態。 – ElpieKay

回答

2

獨立國家元首並且通常無法關閉。您可以進入分離的頭的狀態,只有當你克隆你的倉庫後,例如做這樣的事情

git checkout $specific_commit 

,如果你是在一個名爲分支master

#1 -> #2 -> #3 
      ^
      master 
      ^
      HEAD 

的尖端和你做

git checkout HEAD~ 

在HEAD當前指向之前提交。然後你會在下面的狀態

#1 -> #2 -> #3 
    ^ ^
     |  master 
     | 
     HEAD 

從這一點你是在分離的頭的狀態,最終即在一個特定的頭點提交,而不是在分支標籤。在此之前,HEAD指向分支標籤master,該分支標籤又指向特定的提交(分支尖端)。現在提交的內容將使它們位於沒有分支標籤(即參考)的單獨分支上。運行git branch會告訴你,如果你在脫離頭部狀態。

$ git branch 
* (detached from 60e425a) 
    master 

注意星號*,它表示您當前的分支。 如果你現在做出新的提交git repo將如下所示。

#1 -> #2 -> #3 
     | ^
     |  master 
     | 
     \----> #5 
      ^
      HEAD 

,如果你這樣做git checkout master現在切換回主然後HEAD將切換,當你創建提交#5將不再有任何標記,即一個符號引用導航犯#5已創建master和分支。這意味着您的提交實際上已經丟失。

因此,你有兩個選擇。

  1. 如果你不想在分離頭部狀態結束,那麼就不要做git checkout $specific_commit。始終保持在同一個命名分支的末端,例如master。您可以通過運行git branch來驗證。
  2. 如果你發現自己在分離的頭的狀態,也許你已經作出承諾,你不想「寬鬆」,那麼,作爲上述建議,你需要創建像這樣

    新的分支標籤/參考

    git的結帳-b myNewBranch

這將使你的倉庫看起來像這樣

#1 -> #2 -> #3 
     | ^
     |  master 
     | 
     \----> #5 
      ^
      myNewBranch 
      ^
      HEAD 

然後,如果你這女巫回到master您隨時可以返回做git checkout myNewBranch提交#5和所有分支上的後續提交。

3

只與當地分支機構合作,然後您將永遠不會進入分離狀態。例如,而不是git checkout origin/mastergit checkout master && git pull origin master,另請參閱分支的跟蹤選項。

爲了避免丟失的變化已經坐在一個分離的頭,創建一個分支爲他們:git branch someNameForTheBranch

+0

目前我做'git checkout master',我放棄了我的更改。我不想放鬆他們。 – Dims

+0

@Dims你的問題更多的是如何避免進入這種狀態。如何恢復是一個稍微不同的故事,請參閱我的回覆更新。 –

+0

@Dims不,你不會失去他們。 'git reflog'列出HEAD的歷史記錄,您可以在其中找到最後一個分離的HEAD。 – ElpieKay

1

如果用來做git checkout sha1,你應該添加-b選項來自動創建一個新的分支上提交SHA1和移動上它。

重要的是要避免處於這種狀態。如果要糾正脫離頭部的情況,你可以做

git stash 
git checkout -b StartingPointOfYourBranch 
git stash pop 

「StartingPointOfYourBranch」必須是一個參考:SHA1,產地/主,...在設計git的存在