web-dev-qa-db-ja.com

gitのHEADとは何ですか?

最後のコミット、HEADと、ディレクトリに表示されるファイルの状態には違いがあるようです。

HEADとは何ですか、それで何ができますか、どのような間違いを避けるべきですか?

217
e-satis

HEADは、現在チェックアウトされているブランチの最後のコミットへの参照です。


これには小さな例外がありますが、これは分離されたHEADです。 デタッチされたHEADは、ブランチではなくcommit(またはタグ)をチェックアウトするたびに発生する状況です。この場合、名前のない一時ブランチとしてこれを想像する必要があります。そのため、名前付きブランチ参照を持つ代わりに、onlyにHEADがあります。コミット(HEADを更新します)を行うことができるので、分離されたHEADを名前のない一時的なブランチと考える場合、上記の短い定義は依然として当てはまります。

173
poke

HEADは、現在チェックアウトされているコミットへの参照(参照)です。

通常の状態では、実際にはチェックアウトしたブランチのシンボリック参照です。git/ HEADの内容を見ると、「ref:refs/heads/master」のようなものが表示されます。ブランチ自体は、ブランチの先端にあるコミットへの参照です。したがって、通常の状態では、HEADは事実上、現在のブランチの先端でのコミットを指します。

「切り離されたHEAD」を持つことも可能です。これは、リモートブランチ、特定のコミット、タグなど、(ローカル)ブランチ以外の何かをチェックアウトすると発生します。これを確認する最も一般的な場所は、コミットを編集することを選択した場合の対話型リベース中です。切り離されたHEAD状態では、HEADはコミットへの直接参照です。git/ HEADの内容はSHA1ハッシュになります。

一般的に、HEADは単に「チェックアウトしたもの」を意味する便利な名前であり、あまり心配する必要はありません。あなたがチェックアウトしたものに注意し、あなたが何をしているのか分からない限り、ブランチ上にいない場合(HEAD状態を切り離した)おそらくコミットしたくないことを覚えておいてくださいインタラクティブなリベースにあります)。

84
Cascabel

GitのHEADポインター

GitはHEADと呼ばれる参照変数を保持しています。そして、この変数はポインターと呼ばれます。その目的は、リポジトリー内の特定のコミットを参照または指すことです。新しいコミットを作成すると、ポインターは変更されるか、新しいコミットを指すように移動します。 HEADは常に、リポジトリ内の現在のブランチの先端を指します。これは、ステージングインデックスや作業ディレクトリではなく、リポジトリに関係しています。

それを考える別の方法は、リポジトリの最後の状態または最後にチェックアウトされたものです。リポジトリが中断した場所または最後の状態なので、HEADは親を指していると言うこともできます次のコミット、またはコミットの書き込みが行われる場所です。

これについて考えるのに良いメタファーは、カセットテープレコーダーの再生ヘッドと録音ヘッドだと思います。オーディオの録音を開始すると、テープがヘッドを通過し、テープに録音されます。 Stopを押すと、その録音ヘッドが停止している場所が、もう一度Recordを押したときに再び録音を開始する場所になります。移動できるようになったので、ヘッドを別の場所に移動できます。もう一度Recordを押すと、そこから録音が開始されます。

GitのHEADポインターは非常に似ており、次に録音を開始する場所を指します。これは、私たちがコミットしたことのためにリポジトリで中断した場所です。

14
Suhail Gupta

これはコメントでなければなりませんでしたが、コミットするには長すぎます

以前、HEAD~5は5コミットまでGOを意味すると思っていました。ただし、コマンドのGO部分は含まれていません。コマンドのreference/'where to'partのみを伝達します。

素人用語では、次の質問に答えるために使用されます。WHERE行くべきですか?どのコミットに対して?

あなたが言うなら

HEADは、現在のコミット(への参照)を意味します

HEAD~1は(前の)1コミット前を意味します

HEAD~87は、87コミット前(への参照)を意味します

git checkout HEAD~1は実際にその参照/コミットに行きます

13
Honey

簡単に言えば、HEADは、現在チェックアウトされているブランチの最後のコミットへの参照です。

HEADを「現在のブランチ」と考えてください。 git checkoutでブランチを切り替えると、HEADリビジョンが新しいブランチの先端を指すように変更されます。

HEADが指すものを確認するには、次を実行します。

cat .git/HEAD

HEADは、ブランチ名に関連付けられていない特定のリビジョンを参照する可能性があります。この状況は、分離HEADと呼ばれます。

0
Tester Man