鯨飲馬食

いろいろつまみ食いで勉強したことのメモ書き

git stashの仕組みが面白い

git stash はコミットとしてデータ保存してるんだということを知って、調べると色々分かって面白かったという話。

きっかけはこのツイート

git cat-file -p refs/stash するとわかるけど、タダのcommitなんだね

— @wand_ta 2019年11月27日

refs

ステージングされた変更とローカルの変更がある状態で stash する

コミットが二つできてる。WIP on ...というマージコミットと index on ...というコミット。

WIP on ...にはローカル変更が入った作業ツリーの状態が、index on...にはインデックスの状態が保存されている。

reflog

複数 stash した場合はどこに行ってんだろうと思ったので探したら、reflogにあった。

untracked files

作業ツリー内に履歴管理されてないファイル(HEADのツリーに存在しないパス)がある場合、git stash のオプション -u か -a を指定すればそれも含めて保存してくれる。

オプションによって何が保存されるかは、こないだ整理したものを Qiita に書いてました:

qiita.com

というわけで、履歴管理されてないファイルがあるところで git stash して git log --oneline --graph stash すると、こんなグラフに。

3つの親を持つマージコミットができている。

面白い。