「Gitでワークツリーとインデックスは分かった。」
「でも、そういえばHEADって何者?」
「なんかgit log
とかで出てはくるよね…」
ここを理解していなかったのでまとめます。
そもそもHEADを見て見ぬ振りをしていました。
この概念の理解で各コマンドの理解が一段回進んだ実感があります!
誤り等あればご指摘頂けますと幸いです。
この記事が役立つ人
-
git reset
とかでググった情報をそのまま使ってしまう - 結果、思ってたのと違う挙動を発して現在位置を見失いテンパる
- Gitの構造が良く分かっていない
- Git初心者
HEADってどういうもの?
解釈
今ココのコミットにいるよという情報
公式サイトの説明
「あなたが作業しているローカルブランチへのポインタ」
その他関連用語
インデックス
commit
待ちの情報。
add
すると変更される。
ワークツリー
自分のPC内の情報。
エディタで編集し、ファイルを保存したら変更される。
実際、状態はどう動くの?
git reset
の各オプションでの理解が分かりやすいです。
過去の状態: Before
現在の最新状態: After
として、考えてみます。
今は全部Afterなので、こういう状態ですね。
- HEAD: After
- インデックス: After
- ワークツリー: After
解釈は、以下のようなイメージです。
のび太がしずちゃんに告白して失敗したシーンを例にします。
せっかく作戦を練ってプレゼントを渡したら成功するんじゃないかと考えたのに、失敗して過去に戻りたいというシチュエーションです。
- HEAD プレゼントを渡して告白して失敗した後
- インデックス プレゼントが完成している
- ワークツリー プレゼントを渡す作戦を練り終わった
$ git reset --soft HEAD
- HEAD: Before
- インデックス: After
- ワークツリー: After
【利用シーン】
直前のコミットのみを取り消す際に使う。
addした情報は残る。
【解釈】
しずちゃんに告白する直前に戻る。
「プレゼントの渡し方が悪かったんだ!渡し方を変えるために過去に戻ろう!」
- HEAD プレゼントを渡す前
- インデックス プレゼントが完成している
- ワークツリー プレゼントを渡す作戦を練り終わった
$ git reset HEAD
※—mixedオプションをつけたのと同じ。
- HEAD: Before
- インデックス: Before
- ワークツリー: After
【利用シーン】
addしたのを取り消したい。
addしたファイルにも不備があることが分かった場合。
【解釈】
しずちゃんに告白する前の状態に戻り、かつ用意したプレゼントも変える。
「そもそもプレゼントが悪かったんだ!作り直そう!」
- HEAD プレゼントを渡す前
- インデックス プレゼントは作っていない
- ワークツリー プレゼントを渡す作戦を練り終わった
$ git reset —hard HEAD
- HEAD: Before
- インデックス: Before
- ワークツリー: Beofre
【利用シーン】
やらかした!全てなかったことにしたい!
【解釈】
そもそも作戦を練り直す。
「そもそも作戦自体が悪かったんだ!プレゼント渡すんじゃなくて他のこと考えよう!」
- HEAD プレゼントを渡す前
- インデックス プレゼントは作っていない
- ワークツリー 作戦は白紙
まとめ
Gitは奥深いですね。
何回ものび太を頭の中でタイムスリップさせて構造の理解をしました。
今も頭の中で響きます。「ドラえもーーーーーーーん!」
参考にさせて頂いたサイト(いつもありがとうございます)
GitのHEADとは何者なのか - Qiita
いろいろモヤッとしていた git 初心者が腑に落ちるまで - Qiita
難しいGitコマンドは、仕組みから理解してみよう - Qiita
【永久保存版】Gitのあらゆるトラブルが解決する神ノウハウ集を翻訳した - LABOT 機械学習ブログ
Git - ブランチとは