web-dev-qa-db-ja.com

Gitタグをチェックアウトすると、「デタッチされたHEAD状態」につながります

Gitプロジェクトの展開スクリプトを開発しており、タグの使用を開始しました。 v2.0という新しいタグを追加しました:

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

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

git Push --tags

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

「デタッチHEAD」状態です。見回して実験的な変更を行い、コミットできます。また、別のチェックアウトを実行することにより、ブランチに影響を与えることなく、この状態で行ったコミットを破棄できます。作成したコミットを保持するための新しいブランチは、checkoutコマンドで-bをもう一度使用することで(現在または後で)実行できます。例:git checkout -b new_branch_name HEAD is at at

それは正常ですか?私がそうするならば:

git branch

私はこの出力を取得します:

* (no branch)
  master

これが明らかな場合は申し訳ありませんが、理解できませんでした。

159
Khriz

さて、最初にいくつかの用語を少し単純化しすぎました。

gitでは、tag(他の多くのものと同様)は treeish と呼ばれます。これは、プロジェクトの歴史のある時点を指す方法です。 Treeishesは、タグ、コミット、日付指定子、順序指定子、または他の多くのものです。

branchはタグに似ていますが、移動可能です。ブランチに「オン」になってコミットを行うと、ブランチは作成した新しいコミットに移動し、現在の位置を示します。

HEADは、「現在」と見なされるブランチへのポインタです。通常、リポジトリのクローンを作成するとき、HEADmasterを指し、それは次にコミットを指します。その後、git checkout experimentalなどの操作を行う場合、HEADを切り替えて、別のコミットを指す可能性のあるexperimentalブランチを指すようにします。

さて説明。

git checkout v2.0を実行すると、branchによって指されていないコミットに切り替わります。 HEADは現在「切り離され」ており、ブランチを指していません。今すぐコミットすることにした場合(場合によっては)、このコミットを追跡するために更新するブランチポインターはありません。別のコミットに切り替えると、作成したこの新しいコミットが失われます。それがメッセージがあなたに告げていることです。

通常、できることはgit checkout -b v2.0-fixes v2.0と言うことです。これにより、treeish v2.0(この場合はタグ)が指すコミットに新しいブランチポインターが作成され、HEADがそれを指すようにシフトします。これで、コミットを行うと(v2.0-fixesブランチを使用して)コミットを追跡でき、通常どおりに作業できます。特にv2.0コードを確認したい場合は、これまでに行ったことで「間違った」ことはありません。ただし、追跡したい変更を行いたい場合は、ブランチが必要になります。

GitのDAGモデル全体を理解するのに時間をかける必要があります。驚くほどシンプルで、すべてのコマンドが非常に明確になります。

414
Noufal Ibrahim

はい、それは正常です。これは、ヘッドのない単一のコミットをチェックアウトするためです。特に、(遅かれ早かれ)ブランチのヘッドではありません。

ただし、通常はその状態に問題はありません。これにより、より安全に感じられる場合は、タグから新しいブランチを作成できます:)

12
KingCrunch