这是 "git stash" 操作的有效可视化吗?
Is this a valid visualization of the "git stash" operation?
我找不到 git stash
操作的良好可视化。所以我根据互联网上一些罕见的评论创建了自己的。
这个可视化正确吗?
编辑说明:我需要更改 stash@{0}
的颜色,因为它没有分支。
我的 .git
目录中的存储存储在哪里?我认为它是一个参考并存储在 refs
中,对吗?
图例:
- C1、C2 - 提交
- Idx - 索引
- WD - 工作目录
- 虚线和虚线边框 => 免费用于垃圾收集
重做图像
"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
使用 idx
和 wd
提交来恢复索引和工作树的状态,然后 完全删除它们 来自 refs/stash
。这两个提交现在根本没有名称,因此有资格进行垃圾收集(git gc
现在可以在它们过期后立即删除它们,根据 "prune time",基于你的 gc.pruneExpire
配置)。新的分支名称 test
指向 idx
和 WD
指向的父提交,回到 idx
和 WD
仍然保证存在的时候。
此时立即进行新提交 (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
提交访问)。
我找不到 git stash
操作的良好可视化。所以我根据互联网上一些罕见的评论创建了自己的。
这个可视化正确吗?
编辑说明:我需要更改 stash@{0}
的颜色,因为它没有分支。
我的 .git
目录中的存储存储在哪里?我认为它是一个参考并存储在 refs
中,对吗?
图例:
- C1、C2 - 提交
- Idx - 索引
- WD - 工作目录
- 虚线和虚线边框 => 免费用于垃圾收集
重做图像
"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
使用 idx
和 wd
提交来恢复索引和工作树的状态,然后 完全删除它们 来自 refs/stash
。这两个提交现在根本没有名称,因此有资格进行垃圾收集(git gc
现在可以在它们过期后立即删除它们,根据 "prune time",基于你的 gc.pruneExpire
配置)。新的分支名称 test
指向 idx
和 WD
指向的父提交,回到 idx
和 WD
仍然保证存在的时候。
此时立即进行新提交 (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
提交访问)。