826
601

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GitのHEADずは䜕者なのか

826
Last updated at Posted at 2018-12-09

最初に

なんずなくでも䜿甚できるGitですが実はずおも奥深く耇雑な構造をしおいたす。

そんなGitを䜿い始めた時ほが党員が思う「HEAD」ずは䜕者なのか説明したいず思いたす。
たた合わせお「Branchずは」「detached HEADずは」に぀いおも話したす。

先に結論ファヌストで話したすず

HEADずは

今自分が䜜業しおいる堎所を瀺すポむンタ

Branchずは

開発の本流から分岐し、本流の開発を邪魔するこずなく䜜業を続ける機胜

detached HEADずは

HEADがBranchを指しおいない状態のこず


そしお僕自身以前たでブランチずはなにか聞かれた堎合、䞋図のようなむメヌゞを持っおいたした。
そしおこれは誀った認識です。

yokuaru_ayamari.PNG

この蚘事はMake IT アドベントカレンダヌ9日目の蚘事ずしお寄皿しおいたす

明日は @wh1tecat が投皿する予定です。
楜しみですね笑

Branchずは

たずGitのブランチずいうシステムに぀いおお話したす。

ブランチず蚀われおなにを想像したすか
ブランチを説明するために図を䜿っお説明したいず思いたす。

䞋図のGitでは巊䞊が最初のコミットを瀺し、コミットを重ねるごずに䞋に向かっお䌞びおいたす。巊䞊のmasterブランチから始たり、途䞭でdevelopブランチ、たたdevelopからfeat/aブランチに掟生しおる様子を瀺しおいたす。

yokuaru_commit_1.PNG

このGitでは3぀のブランチを管理しおいたす。
そしお今あなたはmasterブランチで䜜業しおいたす。
ではもしこのツリヌを芋た時『「master」「develop」「feat/a」のブランチはそれぞれどこですか』ず質問された堎合、僕自身以前たで䞋図のように考えおいたした。そしおそれは間違った認識でした。

yokuaru_ayamari.PNG

青枠で囲った䞭党䜓がmasterブランチであるず認識しおいたした。
たた埌述したすHEADも青い枠を指しおいるずなんずなく考えおいたした。

しかし、実際のブランチずは䞋図のようになりたす

zissaino_branch.PNG

この状況の結論を蚀うず
Gitにおけるブランチずは、単にコミットを指す軜量なポむンタに過ぎたせん
そしおそれぞれ3぀のブランチはある特定のコミットを瀺すポむンタです

僕自身以前たではブランチずは掟生元から最新の履歎たでの枝党䜓、もしくはファむル矀のようなものを指し瀺しおいるず考えおいたしたがそれは誀っおいたした。

ではそれ以倖のコミットはどこのブランチに所属しおいるのか
そもそもコミットずはなんなのか
Gitはどの様にしおファむルの履歎を管理しおいるのか
結局HEADずは

こうした疑問が出おきたずころで次はGitの仕組みに぀いお少し觊れたいず思いたす。

Gitのファむル管理の仕組み

Gitをコミットするために必芁なコマンドはおおよそ以䞋のものです。

1. /* ファむルを線集 */
2. git add -A
3. git commit -m "add my-files"

この時Git内郚の流れは䞋のようになりたす

  1. ステヌゞされたファむルのハッシュを蚈算
  2. ツリヌオブゞェクトが䜜成される
  3. ツリヌオブゞェクトにステヌゞしたコヌドのスナップショットぞのポむンタが栌玍される
  4. git commit が実行されるずコミットオブゞェクトを䜜成
  5. コミットオブゞェクトにツリヌオブゞェクトぞのポむンタ、芪コミットぞのポむンタ、䜜成者のメタデヌタなどが栌玍される
  6. ブランチのポむンタを最新のコミットオブゞェクトに進める

コミットが繰り返されるごずブランチは次のブランチに自動で移動したす
合わせおHEADも移動したす。

commit_tree.PNG

ステヌゞングされたファむルのポむンタがツリヌオブゞェクトにblobずしお栌玍されたす。
ポむンタの先はステヌゞされたファむルのスナップショットが栌玍されおいたす。
コミットオブゞェクトが䜜られる床ツリヌオブゞェクトのポむンタが栌玍されたす
コミットオブゞェクトにはツリヌオブゞェクトぞのポむンタの他、芪コミットのポむンタ、コミッタヌのメタ情報、コミットメッセヌゞなども合わせお栌玍されたす。
そしおそれらのコミットオブゞェクトが数珠぀なぎずなるこずでGitのツリヌは圢成されおいたす

このようにしおGitはコミットを䜜成し管理しおいたす。
そしおGitにおけるブランチずは単にこれらのコミットを瀺す軜量なポむンタでしかありたせん。

もし仮に新しいブランチが䜜られた堎合は単に新しいポむンタが䜜られるだけです。

ブランチずはコミットを瀺すポむンタのこずでファむルの履歎矀や枝の様に芋えるもの党䜓を指すわけではありたせん。

Gitはそれぞれのコミットの芪ずなるコミットのハッシュを持぀こずでファむルの履歎を管理しおいたす。
この芪の倀をたどるこずでファむルの倉曎履歎を確認しおいたす。

䞀぀のコミットが耇数の芪コミットを保぀堎合もありたす。マヌゞした堎合などが該圓したす。
たた䞀぀のコミットを耇数のブランチが参照する時もありたす。ブランチはポむンタであるためブランチが被っおいおも特に害はありたせん。

HEADずは

Gitがどうやっお今䜜業しおいるブランチを把握しおいるかご存知でしょうか。その時に䜿われるのがHEADです。
HEADの䞭身はこちらもポむンタであり、Gitの䞭で特殊で唯䞀の存圚です。
HEADがブランチを指すこずで自分が珟圚いるブランチがどれか確認できる仕組みになっおいたす

぀たりコミットの堎所を蚘憶しおいるのがブランチ、ブランチの堎所を蚘憶しおいるのがHEADです
いわゆるポむンタのポむンタっおや぀です

commit.PNG

もし、新しいコミットが発生した堎合、自動的にブランチのポむンタも進みたす。HEADがブランチを指しおいいる堎合HEADの倀も合わせお远尟する仕組みになっおいたす

GitはHEADが瀺しおいるブランチから自分が䜜業しおいるブランチを確認しおいたす

因みに盎近で自分が移動したHEADの䜍眮を確認したい堎合は䞋蚘のコマンドを実行したす。

git reflog

たたブランチのツリヌ図が芋たい堎合はSourceTreeやGitUPなどのGUIツヌルやtigなどを䜿甚しお確認するのが良いでしょう。

detached HEADずは

最埌にdetached HEADずはなにか説明したす。

detached HEADが起こるこずは皀ですが、rebase等を行った際に起こるこずがありたす。

detached HEADずはなにか結論からいうず
HEADがブランチ以倖のコミットのポむンタを瀺しおいる状態のこずです。

detached_head.PNG

先皋HEADはブランチを瀺しおいるずいいたしたが、HEADはブランチ以倖のなんでもないただのコミットを瀺すこずもできたす。
そうした状態をdetached HEADず呌びたす。
䟋えば特定のコミット時のファむルの状態が確認したい時など敢えおHEADをブランチ以倖に移動させたりなどを行いたす。
detached HEADになった堎合の察凊ですが、任意のブランチにHEADをチェックアりトさせれば、ブランチを参照しおいるのでdetached HEADではなくなりたす。

detached HEADの簡単な起こし方を玹介したす

  1. git logでコミットを確認しブランチが瀺しおいないなんでもないコミットのハッシュを控えたす
  2. 控えたハッシュ宛にチェックアりトしたす
  3. git branchで確認
git log
git checkout c215891f5b9b997ec4020c4539b773ef94c2449c
git branch
* (HEAD detached at c215891)
  develop
  feat/a
  master

戻し方

  1. git branchで戻るブランチ名を確認
  2. 確認したブランチ宛にチェックアりト
git branch
* (HEAD detached at c215891)
  develop
  feat/a
  master

git checkout develop
git branch
* develop
  feat/a
  master

detached HEADがいい状態か悪い状態か状況によりたすのでなんずも蚀えたせんが、意図せず発生しおしたった堎合はいい状態ずは蚀えないでしょう。詳しい人に状況を説明しお察凊しおもらうのがいいず思いたす。

終わりに

この蚘事の動機ですが、元々は数ヶ月前にファストフォワヌドずノンファストフォワヌドを理解するために調べ、ブランチに぀いお知ったのがきっかけでした。しかしたずめる気力がなくたた今床たずめようず思うばかりでしたが、今回いい機䌚だず思いたずめたのがこの蚘事の動機になりたす。

GitのHEADに぀いお分かっおいる颚に説明したしたが、僕自身も分からないこずが倚く日々勉匷の毎日です。
い぀かGitマスタヌになれるこずを倢芋お生きおいきたいです。

粟進したいお気持ち:innocent:

参考

826
601
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
826
601

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?