GitのHEADおよびORIG_HEAD


252

これらの記号は何を意味し、どういう意味ですか?

(公式ドキュメントには説明がありません)


4
注:これHEADは(今後のgit1.8.4) ' @'です!以下の私の編集済みの回答を
VonC 2013年

Note-bis: ' @'(for HEAD)はまだ提供されていますが、1.8.4の回答は編集および修正されていません。
VonC 2013

1
注ter: ' @' HEADはgit 1.8.5 / 1.9に戻っています。回答をもう一度編集しました
VonC 2013

21
HEADそして、ORIG_HEADGitのに似ている$PWD$OLDPWDバッシュに。:)
musiphil 2014年

回答:


325

HEAD現在のコミットへの(直接または間接、つまりシンボリック)参照です。これは、作業ディレクトリでチェックインしたコミットであり(変更を加えていないか、同等のものを除く)、「git commit」が新しいコミットを作成する上でのコミットです。通常HEAD、他の名前付きブランチへのシンボリック参照です。このブランチは現在チェックアウトされているブランチ、または現在のブランチです。HEADコミットを直接指すこともできます。この状態は「切り離されたヘッド」と呼ばれ、名前のない匿名のブランチ上にあると理解できます。

また、Git 1.8.5以降@では、それだけでのショートカットHEADになります

ORIG_HEADは以前の状態でHEAD、危険な動作をする可能性のあるコマンドによって設定され、簡単に元に戻すことができます。Gitにreflogがあるため、あまり有用ではありません:HEAD@{1}ORIG_HEAD(のHEAD@{1}最後の値は常にでありHEAD、危険な操作ORIG_HEADHEAD前の最後の値です)とほぼ同じです。

詳細については、git(1)のマンページGitユーザーマニュアルGitコミュニティブック、およびGit用語集を参照してください。


2
こんにちはJakub。説明は+1。HEAD @ {1}の「ほぼ同等の」部分について詳しく教えてください。私は自分の回答でスレッドthread.gmane.org/gmane.comp.version-control.git/38379(2007年 2月に戻ってきました)を参照していますが、皆さんが行っていた議論は正確には理解できませんでした@ {...}構文。
VonC、2009年

19
ORIG_HEADは、HEADを複数のコミットに移動する「危険な」コマンドによってのみ設定されると思います。したがって、ORIG_HEADは常に設定されるわけではなく、HEAD @ {1}は常に設定されます。@ {1}は$(git symbolic-ref HEAD)@ {1}です。つまり、HEAD reflogではなく、現在のブランチにreflogを使用します。
JakubNarębski、2009年

Riiight ...わかりました:)その説明をありがとうございます。それだけの価値があるので、私もあなたのコメントを賛成しました!
VonC、2009年

1
「そしてHEADは、その上に "git commit"が新しいものを作成するコミットです。 "-覚えておくと良いです、ありがとう!また、@ VonCから、「「git commit」ビルドの上にビルドされ、「git diff --cached」と「git status」が比較されます。」
Minqi Pan

1
git help revisionsはgit-scm.com/docs/gitrevisionsを表示し、コミットを参照するすべての方法(HEADおよびを含むORIG_HEAD)を説明します。
dahlbyk 2013

104

git resetから

"pull"または "merge"は常に現在のブランチの元の先端をに残しORIG_HEADます。

git reset --hard ORIG_HEAD

ハードリセットすると、インデックスファイルと作業ツリーがその状態に戻り、ブランチの先端がそのコミットにリセットされます。

git reset --merge ORIG_HEAD

マージの結果を調べた後、他のブランチでの変更が不十分であることがわかる場合があります。「git reset --hard ORIG_HEAD」を実行すると、以前の場所に戻ることができますが、ローカルの変更は破棄されますが、これは不要です。「git reset --merge」はローカルの変更を保持します。


パッチが適用される前に、ORIG_HEADが現在のブランチの先端に設定されます。
これはgit am、間違ったブランチで' 'を実行したり、メールボックスを変更することでより簡単に修正できるコミットのエラー(たとえば、 "From:"行の+エラー)のような複数のコミットに問題がある場合に役立ちます。

さらに、mergeは常に ' .git/ORIG_HEAD'をHEADの元の状態に設定するため、問題のあるマージは ' git reset ORIG_HEAD' を使用して削除できます。


注:ここから

HEADは移動ポインタです。現在のブランチを意味する場合もあれば、そうでない場合もあります。

したがって、HEADはすでに「現在のブランチ」の同義語ではありません

HEADはgitのどこでも「現在の」を意味しますが、必ずしも「現在のブランチ」(つまり、切り離されたHEAD)を意味するわけではありません。

しかし、それはほとんど常に「現在のコミット」を意味します。
これは、「git commit」の上に構築され、「git diff --cached」と「git status」が比較対象のコミットです。
これは、非常に限られたコンテキストでのみ現在のブランチを意味します(ブランチ名を操作したい場合--- commit / rebase / etcを介してブランチの先端をリセットして拡張します)。

Reflogは時間を遡る手段であり、タイムマシンは「現在」の概念と興味深い相互作用を持っています。

HEAD@{5.minutes.ago}「HEAD symrefを逆参照して、今どのブランチにいるかを調べ、そのブランチの先端が5分前にどこにあったかを見つける」ことを意味します。
あるいは、「私が5分前にHEADと呼んでいたコミットとは何でしょうか。たとえば、当時「git show HEAD」を実行した場合」などです。


git1.8.4(2013年7月) 紹介する 新しい表記を導入しました!
(実際には、1.8.5または1.9、2013年第4四半期の予定です:コミット9ba89f4で再導入)

代わりに4大文字「を入力するのHEAD」、あなたが言うことができる「@」今、
例えば「git log @」。

commit cdfd948を参照してください

HEAD特に「@」を使用できる場合は、「」を入力するのは面倒です。

' @' を選択する理由は、ref@op構文HEAD@{u}や例(たとえば)から自然に続くためです。ただし、refも操作もありません。それらがない場合は、 ' HEAD'であると見なされます。

これでgit show @~1、「」を使用できるようになりました。

これまでは「@」は有効な名前でしたが、この考え方と矛盾するため、無効にしてみましょう。この名前を使用した人はいたとしてもごくわずかだろう。


1.8.4-RC3期間中のブログの記事(14日、2013年8月)は、この機能が戻ったと遅れたこと(ありがとう発表しましたカップケーキをヘッドアップ)。
繰り返しになりますが、コミット9ba89f4(2013年9月)で再び導入されました 。

commit 2c2b664を参照してください。

元に戻すには、「新しい追加@のショートカットをHEAD

これはコミット"cdfd948"に戻します。これは " @"(および@{u}それに適用される修飾子を含むフォーム)に適用されるだけでなく、たとえば " refs/heads/@/foo"にも影響を与えるためです。

省略表現を与えるという基本的な考え方は良いかもしれませんし、トピックは後で再試行できますが、今度のリリースで今のところ、既存の使用例に影響を与えないように戻りましょう。


gitを実行した後、ORIG_HEADをリセットしてコミットします。ORIG_HEADは、HEADの隣の参照の下にあります。ビューから削除されなかったのはなぜですか?
powder366

@ powder366がgit reset生成されますORIG_HEAD。したがってrm、手動で行う必要があります。たとえば、stackoverflow.com / a / 12418078/6309をご覧ください。
VonC 2013年

1
@VonCの@エイリアスHEAD、Git 1.8.4リリースで(一時的に?)戻されます!本日発表されました!

「ヘッズアップ」コメントを楽しんだ!
Robino

2

私の理解では、HEADは現在のブランチを指しているのに対し、ORIG_HEADは「危険な」操作を行う前に以前のHEADを格納するために使用されています。

たとえば、git-rebaseとgit-amは、変更を適用する前にブランチの元のヒントを記録します。


4
HEADは常に現在のブランチを指しているわけではありません(分離することができます)
VonC、2009年

1
では、HEADが「切り離されている」ときの「現在のブランチ」とは何でしょうか。
cjs 2017

@ CurtJ.Sampsonそれは「ブランチなし」です。そのため、切り離されたヘッドで、孤立git branch foo -bしたコミットのブランチを「作成」するために行います。
Royi Namir

1

からman 7 gitrevisions

HEADは、作業ツリーでの変更のベースとなったコミットに名前を付けます。FETCH_HEADは、最後のgit fetch呼び出しでリモートリポジトリからフェッチしたブランチを記録します。ORIG_HEADは、HEADを大幅に移動するコマンドによって作成され、操作前のHEADの位置を記録します。これにより、ブランチの先端を実行前の状態に簡単に戻すことができます。MERGE_HEADは、git mergeを実行したときにブランチにマージするコミットを記録します。CHERRY_PICK_HEADは、git cherry-pickを実行したときに選択したコミットを記録します。

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