1. ホーム
  2. git

[解決済み] Gitタグのチェックアウトで "detached HEAD state "になってしまう

2022-04-21 18:57:24

質問

gitプロジェクトのデプロイメントスクリプトを開発していて、タグを使い始めたところです。新しいタグとして v2.0 :

git tag -a v2.0 -m "Launching version 2.0"

そして、このタグをリモートリポジトリにプッシュしました。

git push --tags

デプロイスクリプトを実行し、チェックアウトしようとすると v2.0 タグを使用すると、次のようなメッセージが表示されます。

あなたは「detached HEAD」状態です。見て回ったり、実験的な変更を加えてコミットしたり、コミットを破棄したりすることができます。 を実行することで、どのブランチにも影響を与えずに、この状態で行った 別のチェックアウトを行う。新しいブランチを作成してコミットを保持したい場合 を作成した場合は、(現在でも後でも)チェックアウト コマンドを再度実行します。例: git checkout -b new_branch_name HEAD は現在、以下のとおりです。 で

これって普通?とするとリポジトリが手詰まりになるので。

git branch

このような出力が得られます。

* (no branch)
  master

当たり前のことですが、わからなかったらすみません。

どのように解決するのですか?

さて、まずは少し簡略化された用語について。

git , a tag (他の多くのものと同様に) は、いわゆる ツリー状 . これは、プロジェクトの歴史におけるある一点を参照する方法です。Treeishesは、タグ、コミット、日付指定、序数指定、その他多くのものになります。

今度は branch はタグのようなものですが、移動可能です。ブランチにいるときにコミットを行うと、ブランチは現在の位置を示す新しいコミットに移動します。

あなたの HEAD は、quot;current" とみなされるブランチへのポインタです。通常、リポジトリをクローンするときに HEAD を指します。 master を指し、それがコミットを指すようになります。次に、次のようなことをすると git checkout experimental を切り替えると HEAD を指すようにします。 experimental ブランチは別のコミットを指している可能性があります。

では、説明です。

をすると git checkout v2.0 で指定されていないコミットに切り替わることになります。 branch . その HEAD は現在 "detached"であり、ブランチを指していません。もし今コミットをしようと思ったら (するかもしれませんが)、このコミットを追跡するために更新すべきブランチポインタがありません。別のコミットに戻ると、新しく作成したコミットを失うことになります。これが、このメッセージの意味です。

通常、あなたができることは、次のように言うことです。 git checkout -b v2.0-fixes v2.0 . これは、新しいブランチポインタを、ツリー状の v2.0 (この場合はタグ) を作成し、その後に HEAD を指すようにします。これで、コミットした場合、それを追跡することができるようになります ( v2.0-fixes ブランチ) を作成し、通常と同じように作業することができます。ブランチを見るだけなら、あなたのやったことは何も問題ありません。 v2.0 というコードがあります。しかし、もしそこに何らかの変更を加えて追跡したいのであれば、ブランチが必要になります。

gitのDAGモデル全体を理解するのに時間をかけるべきでしょう。驚くほどシンプルで、すべてのコマンドが非常にわかりやすくなっています。