鯨飲馬食

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

git stashの仕組みが面白い

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

きっかけはこのツイート

refs

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

f:id:yoichi22:20200521075646p:plain

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

f:id:yoichi22:20200521075702p:plain

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

f:id:yoichi22:20200521075726p:plain

reflog

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

f:id:yoichi22:20200521075917p:plain

untracked files

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

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

qiita.com

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

f:id:yoichi22:20200521074257p:plain

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

面白い。