2016-05-29 12 views
1

私は常にデタッチ状態のヘッド状態になっています。私はなぜ、私はそれが何であるか分からない。gitで分離ヘッド状態になるのを避けるには?

この状態から回復しようとするたびに、いくつかのファイルが失われています(最後のコミットから分離ヘッド状態で実行しました)。

この状態を完全に回避することは可能ですか、それとも設計によるのでしょうか?

+1

'git reflog'はあなたの友人です。 – AD7six

+0

'git checkout sha1'を避けてください。ここではsha1はHEAD、FETCH_HEADになります。また、HEAD状態を解除する場合もあります。作業しているブランチを正確に把握している場合は、切り離されたHEAD状態に留まることが大丈夫です。 – ElpieKay

答えて

2

戸建ヘッドの状態はデザインによってはgitに存在する... SHA1、起源/マスター、通常はオフにすることはできません。名前付きブランチmaster

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

の先端にあり、あなたが行う場合は、リポジトリのクローンを作成した後、例えばこの

git checkout $specific_commit 

ような何かを行う場合にのみ、あなたはデタッチヘッド状態に入ることができます

git checkout HEAD~ 

これは、HEADが現在ポイントしているものの直前にコミットされます。そして、あなたがデタッチヘッド状態である。この点から、次の状態

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

になってしまいます、特定のつまりHEADポイントは、分岐ラベルにコミットしていません。これに先立ち、HEADはブランチラベルmasterを指していましたが、順番に特定のコミット(ブランチの先端)を指していました。今では、ブランチラベル(すなわち参照)を持たない別のブランチ上にそれらを置くことを約束します。 git branchを実行すると、頭が孤立しているかどうかがわかります。

$ git branch 
* (detached from 60e425a) 
    master 

現在のブランチを示す星*に注目してください。 新しいコミットを今作成した場合、git repoは次のようになります。あなたがgit checkout masterを行うことで、マスターに戻って今切り替えた場合

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

その後HEADあなたは#5は、もはや#5をコミットするようにナビゲートする任意のラベル、すなわち、記号参照を持ちませんコミット作成時に作成されたmasterとブランチを切り替えます。つまり、あなたのコミットは事実上失われます。

したがって、2つの選択肢があります。

  1. デタッチヘッド状態にしたくない場合は、git checkout $specific_commitを実行しないでください。 masterなど、常に同じ名前のブランチの先端にとどまります。 git branchを実行して確認できます。
  2. あなたがデタッチヘッド状態で自分自身を見つけるのですか、おそらくあなたはすでに行われている場合は、上記に示唆流れると、あなたがそう

    のような新しいブランチラベル/参照を作成する必要があり、あなたはその後、「ゆるい」にしたくないことをコミットあなたのリポジトリが次にもしそう

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

    のように見えるようになります

    Gitチェックアウト-b myNewBranch

masterに戻ると、git checkout myNewBranchを実行して、いつでも#5をコミットして、そのブランチ上のすべてのコミットに戻ることができます。

3

ローカルブランチでのみ動作し、分離状態になることはありません。たとえば、git checkout origin/masterの代わりにgit checkout master && git pull origin masterを実行する場合は、ブランチのトラッキングオプションも参照してください。

すでに切り離さHEADに座った変更を失うことを避けるために、彼らのためにブランチを作成します:git branch someNameForTheBranch

+0

私は 'git checkout master'をやっているうちに、自分の変更を失っています。私はそれらを緩めたくありません。 – Dims

+0

@Dimsあなたの質問はこの状態にならないようにする方法の詳細でした。回復方法は少し違う話ですが、返事の更新をご覧ください。 –

+0

@Dimsあなたはそれらを失うことはありません。 'git reflog'は、最後に切り離されたHEADを見つけることができるHEADの履歴をリストします。 – ElpieKay

1

あなたがgit checkout sha1を行うために使用される場合は、SHA1との移動をコミット時に自動的に新しいブランチを作成する-bオプションを追加する必要がありますそれ。

この状態にならないようにすることが重要です。あなたは切り離さヘッド状況を修正したい場合は行うことができます

git stash 
git checkout -b StartingPointOfYourBranch 
git stash pop 

「StartingPointOfYourBranch」は、参照することがあります。

関連する問題