ブランチ名をチェックアウトする代わりに、(コミット オブジェクトの SHA-1 ハッシュを使用して) 直接コミット名をチェックアウトすると、「切り離された HEAD」になります。HEAD は、現在チェックアウトされているものを追跡する「参照」です。ブランチではなくコミットを直接チェックアウトすると、デタッチされます (どのブランチにもアタッチされません)。リポジトリの HEAD を切り離しても、ブランチは更新されません。デタッチされたヘッドの状態は、匿名のブランチをチェックアウトしたかのように考えることができます。
リポジトリの HEAD を再アタッチするには、現在の HEAD をブランチとして保存し、そのブランチをチェックアウトします。
現在の HEAD を新しいブランチに保存するには、次のようにします。
git branch <new-branch-name>
既存のブランチを上書きするには、次を使用する必要があります--force
。
git branch --force <existing-branch-name>
次に、新しい/更新されたブランチをチェックアウトして、リポジトリの HEAD を再アタッチします。
git checkout <branch-name>
(上記の 2 つのコマンドのどちらを使用したかに応じて、 はまたは<branch-name>
と同じです)<new-branch-name>
<existing-branch-name>
このシーケンス ( git branch
ref を現在の HEAD コミット、次にgit checkout
その更新されたブランチへの参照ポイントにする) は、作業インデックスおよび/またはツリーにある可能性のあるコミットされていないコンテンツをすべて転送します。
将来、現在のブランチを以前のコミットに「ロールバック」したい場合は、リポジトリの HEAD をデタッチする代わりにこれを使用する必要があります。
git reset --hard <commit>
これにより、現在のブランチ (または、既にデタッチされている場合はデタッチされた HEAD) が名前付きコミットにリセットされ、インデックスと作業ツリーにそのコミットが反映されます (つまり、指定されたコミット以降のコミットと、コミットされていないコンテンツが破棄されます)。 )。
切り離された HEAD 状態は、古い状態を再訪する場合や、保持するかどうかわからない短期間の作業に役立つ場合があります。それ以外は、おそらく避けたいと思うでしょう。