我无法找到git stash
操作的良好可视化。所以我根据互联网上的一些罕见评论创建了自己的。
这个可视化是否正确?
编辑备注:我需要更改stash@{0}
的颜色,因为它没有分支。
我的.git
目录中存储的存储区在哪里?我认为它是一个引用并存储在refs
中,对吧?
图例:
返工图片
答案 0 :(得分:3)
"在git stash
"之前&{34;在git stash
"之后图表基本上是正确的(有两个新的提交,不在任何分支上,由refs/stash
又名stash@{0}
指向)。此图表中缺少的是索引和工作树本身被重置,就像git reset --hard
所做的那样 - 事实上,使用 git reset --hard
- 在git stash
之后。
git stash branch
"之后的"图是[编辑以匹配新图]
但是更难以绘制:git stash branch
使用idx
和wd
提交来恢复索引和工作树的状态,然后完全删除它们来自refs/stash
。这两个提交现在根本没有名称,因此有资格进行垃圾收集(git gc
现在可以在它们到期后立即删除它们,根据{"修剪时间",基于{{1在您的配置中)。新分支名称gc.pruneExpire
指向test
和idx
指向的父提交,当{{1}}和WD
仍然保证存在时返回。
此时立即进行新提交(idx
)将从恢复的索引中进行新提交,如更新后的图形所示。
我的.git目录中存储的存储区在哪里?
提交本身是提交,因此与WD
中的任何其他提交一样存储(作为松散或打包的对象)。
我认为它是引用并存储在refs中,对吧?
是的,git stash branch <name> && git commit
是一个参考。 .git/objects/
代码使用(或滥用?)refs/stash
的reflog条目来管理&#34; stash stack&#34;,因此git stash
本身的哈希ID和所有哈希ID都是任何refs/stash
reflog条目中的那些,很重要:它们通过直接指向它来保持refs/stash
提交,并因此保持refs/stash
提交(WD
或第二个idx
的父级是活的(因为它可以通过^2
提交到达)。