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


166

gitプロジェクトのデプロイメントスクリプトを開発していて、タグを使い始めました。という新しいタグを追加しましたv2.0

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

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

git push --tags

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

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

それは正常ですか?私がそうするならば、リポジトリはリンボにあります:

git branch

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

* (no branch)
  master

これが明らかである場合は申し訳ありませんが、私はそれを理解することができませんでした。


「デプロイスクリプトを実行してv2.0をチェックアウトする」と言うと、コードは「git checkout v2.0」のように見えますか?私はリリーススクリプトを改造しようとしていますが、本番マシンから「git checkout v2.0」を実行すると、「エラー:pathspec 'v2.0'はgitで認識されているどのファイルとも一致しませんでした」と表示されます。実稼働環境で「git checkout v2.0」を実行する前に、ローカルマシンで「git push origin --tags」を実行したにもかかわらず、また、「git checkout v2.0」を呼び出す前に、本番環境で「git pull --tags」と「git fetch --tags」を実行してみましたが、それでも機能しません...エラー。何か案は?
John Erck、

3
私は上記のコメントを削除しようとしていましたが、それを維持することが他の誰かを助けるかもしれないと考えました。「git checkout v2.0」を実行しているときにタグ名にTYPOが含まれていたため、エラーが発生しました。ただし、タイプミスに関連するエラーは、「git checkout v2.0」を実行する場合に入力するエラーとまったく同じで、「git fetch --tags」を実行する前にタイプミスはありません。したがって、最終的には、タイプミスなしで「git checkout v2.0」を実行する前に「git fetch --tags」を実行することで、私の問題は解決しました。ふew!
John Erck、

ええ、ええ、あなたは前にfetch --tags(またはリモートからすべてをプルするgit fetch)をする必要があるので、gitはタグをチェックアウトできます。今日はあなたのコメントを見ました。
Khriz、2012年

回答:


429

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

ではgittag(他の多くのものと同様に)は「ツリーっぽい」と呼ばれます。これは、プロジェクトの履歴のある時点を参照する方法です。Treeishesには、タグ、コミット、日付指定子、序数指定子など、さまざまなものがあります。

これでa branchはタグに似ていますが、移動可能です。ブランチを「オン」にしてコミットすると、ブランチは現在の位置を示す新しいコミットに移動します。

あなたHEADは「現在の」と考えられているブランチへのポインタです。通常、リポジトリのクローンを作成すると、HEADがポイントしmaster、次にリポジトリがコミットをポイントします。次にのようなgit checkout experimentalことをすると、別のコミットを指す可能性がHEADあるexperimentalブランチを指すようにを切り替えます。

次に説明します。

を実行するとgit checkout v2.0、によって指されていないコミットに切り替わりますbranchHEAD今、「デタッチ」と枝を指していません。コミットを今すぐ行うことにした場合は(可能であれば)、このコミットを追跡するために更新するブランチポインターはありません。別のコミットに切り替えると、この新しいコミットが失われます。それがメッセージが伝えていることです。

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

gitのDAGモデル全体を理解するには、ある程度の時間を費やす必要があります。驚くほど簡単で、すべてのコマンドが非常に明確になります。


わかりました。コードに変更を加える必要はないので、問題ないと思います。ブランチを作成する必要はありません。どうもありがとう!
Khriz、2011

1
私はこの答えを初めて見たときに迷子になりましたが、Gitブランチのドキュメントを読んだ後:http : //git-scm.com/book/en/Git-Branching-What-a-Branch-それははるかに明確でした。
マーク・スタイルズ2013年

3
すばらしい回答ですが、「別のコミットに戻すと、作成した新しいコミットが失われます。」—それでもコミットを見つけることができるので、git reflog知っておくと便利です。ガベージコレクションが発生していない限り、コミットを失うことは「不可能」のようです。
ドミトリーミンコフスキー2013

参照されていないコミットは、ガベージコレクション操作によって失われる可能性があります。
Noufal Ibrahim 2013

1
ページのレイアウトが変更されたため、URLが間違っています。
jcubic 2014

12

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

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


1
OK、私はそれをその方法で維持します...安全性はとにかく過大評価されています;)
Khriz

Noufalsの回答でコメントしたように(その方が良いので、私は;)と言わなければなりません):何も変更しない限り、心配する必要はありません。ただし、何かを変更する可能性があると想定する場合は、ブランチを作成できます。これは、ブランチがgitで安価であり、削除できる(後で再作成できるなど)ためです。
KingCrunch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.