Git

GitのHEADを理解する

More than 3 years have passed since last update.

rebaseを取り消す際にHEADではなくORIG_HEADを指定することを理解せずにやっていましたが、HEADも実はよく分かっていないことに気づいたので、調べることにしました。

公式ドキュメントの少し分かりにくいことろにきちんと載っていました。

5つのHEAD

以下の英文はgitrevisionsから引用しています。

HEAD

ワーキングツリーの最新のコミット

HEAD names the commit on which you based the changes in the working tree.

FETCH_HEAD

最後にフェッチを行ったブランチを(記録)

FETCH_HEAD records the branch which you fetched from a remote repository with your last git fetch invocation.

ORIG_HEAD

HEADが移動するコマンドを叩いた際に、コマンド実行時のHEADの位置を記録

ORIG_HEAD is created by commands that move your HEAD in a drastic way, to record the position of the HEAD before their operation, so that you can easily change the tip of the branch back to the state before you ran them.

MERGE_HEAD

マージの際に、ブランチに統合されたコミット(群)を記録

MERGE_HEAD records the commit(s) which you are merging into your branch when you run git merge.

CHERRY_PICK_HEAD

チェリーピックの際に、ブランチに統合されたコミットを記録

CHERRY_PICK_HEAD records the commit which you are cherry-picking when you run git cherry-pick.

HEADは一時的なコミット(群)の記録

gitはよく図形的に説明されるのでHEADを位置と説明されますが、FETCH_HEADやMERGE_HEADの説明からわかるようにHEADは位置を表すわけではないようです。ただ大抵の場合HEADやORIG_HEADしか意識されないので、結局のところ「HEADはコミットの位置」という解釈でよい気がします。

謝辞

最後まで読んでいただき、誠にありがとうございます。