次のようなことを言っているGitのドキュメントを見る
ブランチはHEADで完全にマージする必要があります。
しかし、GitとはHEAD
正確には何ですか?
次のようなことを言っているGitのドキュメントを見る
ブランチはHEADで完全にマージする必要があります。
しかし、GitとはHEAD
正確には何ですか?
回答:
HEADは「現在のブランチ」と考えることができます。でブランチを切り替えるとgit checkout
、HEADリビジョンは新しいブランチの先端を指すように変更されます。
HEADが何を指しているかを確認するには、次のようにします。
cat .git/HEAD
私の場合、出力は次のとおりです。
$ cat .git/HEAD
ref: refs/heads/master
HEADは、ブランチ名に関連付けられていない特定のリビジョンを参照することができます。この状況は、切り離されたHEADと呼ばれます。
ヘッドは単にコミットオブジェクトへの参照です。各ヘッドには名前(ブランチ名やタグ名など)があります。デフォルトでは、マスターと呼ばれるすべてのリポジトリにヘッドがあります。リポジトリには、任意の数のヘッドを含めることができます。常に、1つのヘッドが「現在のヘッド」として選択されます。このヘッドは常に大文字でHEADにエイリアスされています。」
この違いに注意してください。「ヘッド」(小文字)は、リポジトリ内の名前付きヘッドのいずれかを指します。「HEAD」(大文字)は、現在アクティブなヘッドのみを指します。この区別は、Gitのドキュメントで頻繁に使用されます。
gitの内部動作をすばやくカバーする別の優れたソース(そして、ヘッド/ヘッドの理解を深める)は、こちらにあります。参照(ref :)またはヘッドまたはブランチは、コミット履歴のコミットに貼り付けられた付箋のようなものと考えることができます。通常、彼らはコミット一連の先端を指すが、彼らは周りに移動することができgit checkout
たりgit reset
など
git checkout HEAD~2
、既知のヘッドのコミットIDではない、たとえばを使用して指定したコミットのコミットIDを指しています。より完全な説明については、eagain.net / articles / git- for -computer-scientistsの記事を参照してください。
git revert
、git revert
新しいコミットを作成し、現在のブランチを(新しい)チップのままにするだけなので、ブランチをチップに移動しない良い例ではありません。
commit
の動作に影響しますreset
github開発者のスコットチャコンによるこの定義をお勧めします[ ビデオ参照 ]:
ヘッドはあなたの現在のブランチです。これはシンボリックリファレンスです。ブランチへの参照です。あなたは常にHEADを持っていますが、HEADはこれらの他のポインターの1つを指していて、現在のブランチの1つを指しています。次のコミットの親です。これは、作業ディレクトリに最後にチェックアウトされたものでなければなりません...これは、作業ディレクトリが最後に確認された状態です。
ビデオ全体でgitシステム全体を公平に紹介しますので、時間があれば、すべてをご覧になることもお勧めします。
HEADは、現在使用しているローカルブランチを指す特別なポインターです。
プロGitのブック、章3.1 Gitのブランチ-一言で支店セクションで、新しいブランチを作成します:
新しいブランチを作成するとどうなりますか?そうすると、移動するための新しいポインタが作成されます。たとえば、testingという新しいブランチを作成するとします。これを行うには、git branchコマンドを使用します。
$ git branch testing
これにより、現在行っているのと同じコミットで新しいポインタが作成されます
Gitは現在どのブランチにいるかをどのようにして知るのですか?HEADと呼ばれる特別なポインタを保持します。これは、SubversionやCVSなど、使い慣れた他のVCSのHEADの概念とは大きく異なることに注意してください。Gitでは、これは現在使用しているローカルブランチへのポインターです。この場合、あなたはまだマスターです。git branchコマンドは新しいブランチを作成しただけで、そのブランチには切り替わりませんでした。
34ac2
上記の例でチェックアウトすると、HEADはそのコミットを指し、デタッチされたHEADと呼ばれます。この状態では、変更を加えて実験し、変更をコミットすることもできますが、別のブランチをチェックアウトすると、もちろん新しいブランチを作成しない限り、すべての変更が失われます。
git log
ようなものが得られた場合commit ad0265... HEAD -> foo ...
、foo
ブランチはcommit idへの参照であることを意味しad0265
ます。テキスト参照のチェックアウトを行うことfoo
は、分離したヘッドではありません。コミットIDのチェックアウトを実行するad0265
と、ヘッドが切り離されます。あなたが伝えていることの微妙なところが欠けているのかもしれません。このテキストの壁が、私がどこで失われたかを発見するのに役立つことを願っています。
これらの回答の多くには、微妙ではあるが重要な誤解があります。私はそれを明らかにするために私の答えを追加すると思いました。
なに
HEAD
?
HEAD
コミット履歴のどこにいてもシンボリックリファレンスです。どこへ行っても、影のように何でもします。コミットするHEAD
と移動します。何かをチェックアウトすると、HEAD
移動します。あなたが何をするにせよ、あなたがあなたのコミット履歴のどこか新しい場所に移動したなら、あなたもHEAD
一緒に移動しました。1つの一般的な誤解に対処するには:自分から切り離すことはできませんHEAD
。それは、切り離されたHEAD状態とは異なります。「いやいや、私は切り離されたHEAD状態です。HEADを失いました!」覚えておいてください、それはあなたの頭です。HEADはあなたです。あなたはヘッドから切り離されていません。あなたとあなたのヘッドは別のものから切り離されています。
HEAD
はい、コミットを指すことができますが、通常はそうではありません。もう一度言いましょう。通常HEAD
、コミットを指しません。ブランチ参照を指します。これはそのブランチにアタッチされており、特定の操作(commit
またはなどreset
)を実行すると、アタッチされたブランチはと一緒に移動しHEAD
ます。フードの下を見ると、それが何を指しているのかを確認できます。
cat .git/HEAD
通常は次のようになります。
ref: refs/heads/master
時々あなたはこのようなものを得るでしょう:
a3c485d9688e3c6bc14b06ca1529f0e78edd3f86
これが、HEAD
直接コミットを指す場合に起こります。これはHEAD
、ブランチ参照以外のものを指しているため、デタッチされたHEADと呼ばれます。この状態でコミットすると、master
にアタッチされなくなったはHEAD
、一緒に移動しなくなります。そのコミットがどこにあるかは問題ではありません。マスターブランチと同じコミットである可能性がありますが、がブランチでHEAD
はなくコミットを指している場合、それは切り離され、新しいコミットはブランチ参照に関連付けられません。
次の演習を試すと、これをグラフィカルに見ることができます。gitリポジトリから、これを実行します。あなたは少し異なるものを取得しますが、それらのキービットはそこにあります。コミットを直接チェックアウトするときは、最初の出力(ここではa3c485d
)から取得した短縮ハッシュを使用します。
git checkout master
git log --pretty=format:"%h: %d" -1
# a3c485d: (HEAD -> master)
git checkout a3c485d -q # (-q is for dramatic effect)
git log --pretty=format:"%h: %d" -1
# a3c485d: (HEAD, master)
OK、そのため、ここでは出力に小さな違いがあります。(ブランチではなく)コミットを直接チェックアウトすると、矢印ではなくコンマが表示されます。あなたはどう思いますか、私たちは切り離されたHEAD状態ですか?HEADはまだブランチ名に関連付けられている特定のリビジョンを参照しています。我々はまだだ上で、我々は、masterブランチされていませんか?
今試してください:
git status
# HEAD detached at a3c485d
いいえ。私たちは「切り離されたヘッド」状態にあります。
あなたは、同じ表現を見ることができます(HEAD -> branch)
対を(HEAD, branch)
とgit log -1
。
HEAD
あなたです。どこにいても、チェックアウトしたものを指します。通常、これはコミットではなく、ブランチです。HEAD
がコミット(またはタグ)を指している場合、ブランチも指すコミット(またはタグ)と同じであっても、あなた(およびHEAD
)はそのブランチから切り離されています。ブランチがアタッチされていないので、新しいコミットを行うときにブランチはあなたに付いていきません。HEAD
ただし、します。
.git/HEAD
ソフトウェアがHEADと見なすものです。
HEAD
作業コピーが指している現在のコミット、つまり現在チェックアウトしているコミットを指します。Gitリビジョンの指定に関する公式のLinuxカーネルドキュメントから:
HEAD
作業ツリーでの変更のベースとなったコミットに名前を付けます。
ただし、Gitの寄稿者であるJunio C Hamanoが彼のGit Blameブログで指摘しているように、Gitの次のバージョン1.8.4では@
、の省略形としても使用できることに注意してください。HEAD
「HEAD」と入力する代わりに、「git log @」など、代わりに「@」と発声できます。
Stack OverflowのユーザーVonC は、別の質問への回答で速記として選ばれた理由に関する興味深い情報@
も見つけました。
また、一部の環境ではHEAD
、特に大文字と小文字を区別しないファイルシステムを使用するオペレーティングシステム、特にWindowsとOS Xでは、大文字にする必要がない場合もあります。
ブランチの作成と操作を見てください
HEADは実際にはHEAD変数が参照する場所を決定する内容を持つファイルです。
$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
35ede5c916f88d8ba5a9dd6afd69fcaf773f70ed
このリポジトリでは、HEADファイルのコンテンツはrefs / heads / masterという名前の2番目のファイルを参照します。ファイルrefs / heads / masterには、masterブランチでの最新のコミットのハッシュが含まれています。
その結果、HEADは.git / refs / heads / masterファイルからのマスターブランチコミットを指します。
グレッグ・ヒューギルの認められた答えのいくつかを詳しく述べたいと思います。Git Pocket Guideによると
ブランチ:
ブランチ自体は、名前付きコミット(ブランチの「ヒント」)からコミットグラフで到達可能なすべてのポイントとして定義されます。
HEAD:特別なタイプの参照
特別なリファレンスであるHEADは、どのブランチにいるかを決定します...
参照
Gitは2種類の参照、つまり「参照」と呼ばれる名前付きポインターを定義します。
- オブジェクトID(通常はコミットまたはタグ)を直接指す単純な参照
- シンボリック参照(またはsymref)、別の参照(単純またはシンボリック)を指す
Gregが述べたように、HEADは「切り離された状態」になる可能性があります。したがって、HEADは単純な参照(分離されたHEADの場合)またはsymrefのいずれかになります。
HEADが既存のブランチのシンボリック参照である場合、そのブランチは「オン」です。一方、HEADがSHA-1 IDで直接コミットに名前を付ける単純な参照の場合、ブランチは「オン」ではなく、「切り離されたHEAD」モードです。調査することを約束します。
「HEAD」は現在のチェックアウトコミットだと思います。つまり、「HEAD」は現在チェックアウトされているコミットを指します。
クローンを作成してチェックアウトしていない場合、それが何を指しているのかわかりません。おそらく無効な場所です。
master
ブランチをチェックアウトするため、HEADはマスターをポイントします。
master
はですが、常にそうとは限りません。参照remote set-head
remote set-head
が、ローカルのデフォルトブランチにのみ影響し、サーバーのデフォルトは変更されません。
ヘッドは現在チェックアウトされているブランチの先端を指します。
リポジトリには.gitフォルダーがあります。次の場所にあるファイルを開きます:.git \ refs \ heads。そのファイル(ほとんどの場合はマスター)の(sha-1ハッシュ)コードは、最新のコミット、つまりコマンドの出力に表示されるものになりgit log
ます。.gitフォルダーの詳細:http : //gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html
git reset HEAD^
、最新のコミット(以前のヒント)がブランチのヒントによってポイントされなくなりました。
以前のすべての回答を読んだ後、私はさらに明確にすることを望みました。公式のgit Webサイトhttp://git-scm.com/blogにあるこのブログは、私が探していたものを与えてくれました:
GitのHEADは、現在のブランチ参照へのポインタであり、現在のブランチ参照は、最後に行ったコミットまたは作業ディレクトリにチェックアウトされた最後のコミットへのポインターです。これはまた、次のコミットの親になることも意味します。HEADは最後のコミットのスナップショットであるため、一般的に考えると最も簡単です。
HEAD
コミットではありません。それは 1つを指します。
checkout HEAD^
、HEADはどのブランチの最後のコミットスナップショットも指しません。
commit
、merge
、rebase
、log
、などしかし、概念的には、多分「(ポインタ)が現在の位置が」良い要約です。
それはHEAD
あなたがチェックアウトした最後のコミットの単なるタグのように感じます。
これは、特定のブランチの先端(「マスター」など)またはブランチの中間のコミット(「切り離されたヘッド」)の場合があります。
これらの2つはあなたを混乱させるかもしれません:
頭
最近提出されたブランチの名前付き参照を指します。パッケージ参照を使用しない限り、ヘッドは通常$ GIT_DIR / refs / heads /に保存されます。
頭
現在のブランチ、または作業ツリーは通常、HEADが指しているツリーから生成されます。分離したHEADを使用している場合を除き、HEADはヘッドを指す必要があります。
見てくださいhttp://git-scm.com/book/en/Git-Branching-What-a-Branch-Isを
図3-5。現在のブランチを指すHEADファイル。
概念として、ヘッドはブランチの最新リビジョンです。名前付きブランチごとに複数のヘッドがある場合、マージせずにローカルコミットを実行するときにおそらくそれを作成し、事実上名前なしブランチを作成しました。
「クリーンな」リポジトリを作成するには、名前付きブランチごとに1つのヘッドがあり、ローカルで作業した後は常に名前付きブランチにマージする必要があります。
これはMercurialにも当てはまります。