git stash はコミットとしてデータ保存してるんだということを知って、調べると色々分かって面白かったという話。 きっかけはこのツイート git cat-file -p refs/stash するとわかるけど、タダのcommitなんだね— エロリツイート (@wand_ta) 2019年11月27日 refs ステージングされた変更とローカルの変更がある状態で stash する コミットが二つできてる。WIP on ...というマージコミットと index on ...というコミット。 WIP on ...にはローカル変更が入った作業ツリーの状態が、index on...にはインデックスの状態が保存されている。 ほんとだ。ローカルの作業ツリーに対するコミットオブジェクトと、その親にインデックスの内容に対するコミットオブジェクトが作られてて、その親が変更元のHEADという構造なんですね。
![git stashの仕組みが面白い - 鯨飲馬食](https://cdn-ak-scissors.b.st-hatena.com/image/square/c5e49f51369e8dbe7a7c1bc4378dfc1015e98506/height=288;version=1;width=512/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fy%2Fyoichi22%2F20200521%2F20200521075646.png)