这是 "git stash" 操作的有效可视化吗?

Is this a valid visualization of the "git stash" operation?

我找不到 git stash 操作的良好可视化。所以我根据互联网上一些罕见的评论创建了自己的。

这个可视化正确吗?

编辑说明:我需要更改 stash@{0} 的颜色,因为它没有分支。

我的 .git 目录中的存储存储在哪里?我认为它是一个参考并存储在 refs 中,对吗?


图例:


重做图像

"before git stash" 和 "after git stash" 图基本上是正确的(有两个新的提交,不在任何分支上,由 refs/stash 又名 stash@{0} 指向)。此图中缺少的是索引和工作树本身被重置,以与 git reset --hard 相同的方式 - 实际上, 使用 git reset --hard - 在git stash.

"after git stash branch" 图是[编辑以匹配新图] 但是更难绘制:git stash branch 使用 idxwd 提交来恢复索引和工作树的状态,然后 完全删除它们 来自 refs/stash。这两个提交现在根本没有名称,因此有资格进行垃圾收集(git gc 现在可以在它们过期后立即删除它们,根据 "prune time",基于你的 gc.pruneExpire配置)。新的分支名称 test 指向 idxWD 指向的父提交,回到 idxWD 仍然保证存在的时候。

此时立即进行新提交 (git stash branch <name> && git commit) 将从恢复的索引进行新提交,如更新后的绘图。

Where are stashes stored in my .git directory?

提交本身就是提交,因此像任何其他提交一样存储在 .git/objects/ 中(作为松散或打包的对象)。

I think it's a reference and stored in refs, right?

是的,refs/stash是参考。 git stash 代码使用(或滥用?)refs/stash 的 reflog 条目来管理 "stash stack",因此 refs/stash 本身中的哈希 ID 以及任何 refs/stash reflog 条目,重要的是:它们通过直接指向它来使 WD 提交保持活动状态,因此也保持 idx 提交(^2 或 [= 的第二个父级) 26=]) 活着(因为它可以通过 WD 提交访问)。