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
これが明らかな場合は申し訳ありませんが、理解できませんでした。
さて、最初にいくつかの用語を少し単純化しすぎました。
git
では、tag
(他の多くのものと同様)は treeish と呼ばれます。これは、プロジェクトの歴史のある時点を指す方法です。 Treeishesは、タグ、コミット、日付指定子、順序指定子、または他の多くのものです。
branch
はタグに似ていますが、移動可能です。ブランチに「オン」になってコミットを行うと、ブランチは作成した新しいコミットに移動し、現在の位置を示します。
HEAD
は、「現在」と見なされるブランチへのポインタです。通常、リポジトリのクローンを作成するとき、HEAD
はmaster
を指し、それは次にコミットを指します。その後、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モデル全体を理解するのに時間をかける必要があります。驚くほどシンプルで、すべてのコマンドが非常に明確になります。
はい、それは正常です。これは、ヘッドのない単一のコミットをチェックアウトするためです。特に、(遅かれ早かれ)ブランチのヘッドではありません。
ただし、通常はその状態に問題はありません。これにより、より安全に感じられる場合は、タグから新しいブランチを作成できます:)