gitのHEADとは何ですか?


232

最後のコミット、HEAD、およびディレクトリで確認できるファイルの状態に違いがあるようです。

HEADとは何ですか?それを使用して何ができますか、どのような間違いを避ける必要がありますか?



1
、Gitのv1.8.4とその使用の下にすべての答えを開始するHEADか、head今すぐ使用することができます@の代わりにHEAD代わりに。なぜそれができるのかについては、この回答(最後のセクション)を参照してください。

3
git-scmから:GitのHEADは、現在のブランチ参照へのポインターです。これは、最後に行ったコミットまたは作業ディレクトリにチェックアウトされた最後のコミットへのポインターです。これはまた、次のコミットの親になることも意味します。HEADは最後のコミットのスナップショットなので、一般的に考えると最も簡単です。
Quazi Irfan 2016

回答:


185

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


これには小さな例外があります。デタッチされたヘッドです。切り離さHEADは、あなたがチェックアウトするたびに終わるような状況であるコミットの代わりに支店の(またはタグ)。この場合、これは名前のない一時的なブランチであると想像する必要があります。したがって、名前付きブランチ参照を持つ代わりに、HEAD のみを持ちます。それでもコミット(HEADを更新する)を行うことができるため、デタッチされたHEADを名前のない一時的なブランチと見なす場合も、上記の短い定義は当てはまります。


1
では、なぜ2つの頭を持つことができるのでしょうか。
e-satis

1
@ e-satis:ヘッドと呼ばれるブランチが表示されることがあります-それらはに保存されていますrefs/headsHEADただし、小文字の頭はとは異なります。私の答えはこれを少し明確にします。
Cascabel

7
@ e-satis:それは正規表現ではありません。これ^は単に「前のコミット」のgitの表記法です。つまり、現在のコミットの前のコミットです。(現在がマージの場合、最初の親を使用します。)
Cascabel

1
@ e-satis:コミットを指定するすべての方法の詳細については、git-rev-listのmanページのリビジョンの指定のセクションを参照してください。これはほんの一部です。kernel.org/pub/software/scm/git/docs/...
カスカベル

1
いいえ、revとHEADが同じコミットを指している場合、違いはありません。また、revやHEADの代わりにコミットID(SHA-1値)を書き込むこともできます。そして、あなたがいない嫌がらせ私たちを質問:)で行う、心配しないでください(私は、少なくとも:P)
突く

87

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

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

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

一般的に言って、HEADは「チェックアウトしたもの」を意味する便利な名前であり、それほど心配する必要はありません。チェックアウトした内容に注意してください。ブランチを使用していない場合(デタッチされたHEAD状態)は、自分が何をしているのか(たとえば、インタラクティブなリベースの場合)を知らない限り、コミットしたくないでしょう。 。


6
これは私には理解できません。リモートブランチをチェックアウトする場合、「デタッチされたヘッド」が表示されるのはなぜですか。リモートに対応するローカルリポジトリのブランチに自動的にジャンプしませんか?
e-satis

3
@ e-satis:ローカルブランチが必要な場合は、ローカルブランチをチェックしてください。2つは必ずしも同じではないことに注意してください。ローカルの1つにリモートの1つをマージ(またはプル)するように指示する必要があります。追跡は、要求されたときに自動的にプルするものを把握するためのものです。それが切り離されている理由は、リモートブランチがリモートリポジトリ内の最後に見られたブランチの場所へのポインタになることを目的としているためです。コミットしようとしても、リモートリポジトリは変更されないため、リモートブランチも変更されません。
Cascabel

1
OK、それは私が得なかったものです:ローカルブランチに名前を付けても、リモートブランチと同じであるとは限りません。私はSVNのバックグラウンドを持っているので、最初に理解するのが本当に難しい:-) ところで、ヘッドレスヘッドをローカルブランチに移動してここでコミットするにはどうすればよいですか。
e-satis

3
@ e-satis:一般的な答えはgit rebase <branch> HEADです。これが最後の共通の祖先を見つける<branch>HEAD、その後、そこからのすべてのコミットを取るHEADと上に(それらをリベース)、それらを適用します<branch>。基本的にはパッチとして適用することでこれを行うため、2つのブランチが実際に異なる場合、競合が発生する可能性があります。しかし、もし<branch>祖先が先祖である場合HEAD(つまり、あなたが適切な場所にいて、あなたが切り離したことを忘れていた場合HEAD)、リベースは早送りマージです。
Cascabel

3
これは、しばらく検索した後、私が見たgit HEADの最も明確で正確な説明の1つです。
LarsH 2016

21

私はいつも、HEAD~5以前に5つのコミットに移動することを意味すると思っていました。ただし、コマンドのGO部分は含まれません。コマンドのreference / 'where to'の部分のみが含まれます。

:素人用語で、の問いに答えるために使われています、私は行くべきか?どのコミットに?

  • HEAD 現在のコミット(への参照)を意味します
  • HEAD~1 前の1つのコミット(への参照)を意味します
  • HEAD~ ALSOは、(参照)1コミット前を意味します
  • HEAD~87 は(参照)87回前のコミットを意味します

使用法:

  • git checkout HEAD~1 実際には、前に1つのコミット/参照にGO /チェックアウトします
  • git reset HEAD~3 変更を削除せずに、最後の3つのコミットをコミット解除します。つまり、最後の3つのコミットで行われたすべての変更をまとめて確認し、不要なものを削除したり、それに追加したりして、すべてを再度コミットします。
  • git reset --hard HEAD~3最後のコミットをコミット解除し、それらの変更を削除します。これらの変更は完全に削除されます。詳しくはこちらをご覧ください
  • git diff HEAD~3 最後の3つのコミットの変更をチェックするため

3
私自身の答えに戻ってきます:)
Honey

15

GitのHEADポインター

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

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

これを考えるのに良い比喩は、カセットテープレコーダーの再生ヘッドと録音ヘッドです。オーディオの録音を開始すると、テープがヘッドを通過し、ヘッドに録音されます。[停止]を押すと、その記録ヘッドが停止した場所が、もう一度[記録]を押すと記録を再開する場所になります。これで、移動できるようになりましたが、ヘッドを別の場所に移動できますもう一度Recordを押すと、録音が​​開始されます。

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


0

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

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

HEADが何を指しているかを確認するには、次のようにします。

cat .git/HEAD

HEADは、ブランチ名に関連付けられていない特定のリビジョンを参照することができます。この状況は、分離したヘッドと呼ばれます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.