ずっと頭が離れた状態になっています。なぜだか分からないし、それが何なのかも分からない。
この状態から回復しようとするたびに、いくつかのファイルが失われます (切り離されたヘッド状態で行った最後のコミットから)。
この状態を完全に回避することは可能ですか、それとも設計によるものですか?
ずっと頭が離れた状態になっています。なぜだか分からないし、それが何なのかも分からない。
この状態から回復しようとするたびに、いくつかのファイルが失われます (切り離されたヘッド状態で行った最後のコミットから)。
この状態を完全に回避することは可能ですか、それとも設計によるものですか?
デタッチされたヘッド状態は設計上 git に存在し、通常はオフにすることはできません。リポジトリのクローンを作成した後、次のようなことを行う場合にのみ、切り離されたヘッド状態に入ることができます
git checkout $specific_commit
たとえば、名前付きブランチの先端にいる場合master
#1 -> #2 -> #3
^
master
^
HEAD
あなたがやる
git checkout HEAD~
これは、HEAD が現在指している直前にコミットされます。その後、次の状態になります
#1 -> #2 -> #3
^ ^
| master
|
HEAD
この時点から、切り離された head 状態になります。つまり、HEAD はブランチ ラベルではなく特定のコミットを指します。この HEAD の前はmaster、特定のコミット (ブランチの先端) を順番に指していたブランチ ラベルを指していました。これまでに作成したコミットは、ブランチ ラベル (つまり、参照) を持たない別のブランチになります。実行git branchすると、ヘッドが切り離された状態であるかどうかがわかります。
$ git branch
* (detached from 60e425a)
master
*現在のブランチを示す星に注目してください。今すぐ新しいコミットを作成すると、git repo は次のようになります。
#1 -> #2 -> #3
| ^
| master
|
\----> #5
^
HEAD
実行して master に戻すと、 commit を作成しgit checkout masterたときに作成されたブランチHEADに切り替えられ、ラベル、つまり commit に移動するためのシンボリック参照がなくなります。つまり、コミットは事実上失われます。master#5#5
したがって、2 つのオプションがあります。
git checkout $specific_commit。などの同じ名前のブランチの先端に常にとどまりmasterます。を実行することで確認できますgit branch。デタッチされたヘッド状態にあることに気付き、「緩め」たくないコミットを既に行っている可能性がある場合は、上記のフローで提案されているように、新しいブランチ ラベル/参照を作成する必要があります。
git チェックアウト -b myNewBranch
これにより、リポジトリが次のようになります
#1 -> #2 -> #3
| ^
| master
|
\----> #5
^
myNewBranch
^
HEAD
その後、元に戻せば、 を実行することで、masterいつでもコミットに戻り#5、そのブランチでの後続のすべてのコミットに戻ることができますgit checkout myNewBranch。
ローカル ブランチでのみ作業すると、切り離された状態になることはありません。たとえば、git checkout origin/masterdoの代わりにgit checkout master && git pull origin master、ブランチの追跡オプションも参照してください。
デタッチされた HEAD に既にある変更が失われないようにするには、それらのブランチを作成します。git branch someNameForTheBranch
を行っていた場合は、コミット sha1 に新しいブランチを自動的に作成して移動するオプションをgit checkout sha1追加する必要があります。-b
この状態にならないようにすることが最優先です。取り外した頭の状況を修正したい場合は、次のことができます
git stash
git checkout -b StartingPointOfYourBranch
git stash pop
「StartingPointOfYourBranch」は参照でなければなりません: sha1、origin/master、...