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

Pae*_*els 3 git visualization git-stash

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

在此处输入图片说明

这个可视化正确吗?

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

stash 存储在我的.git目录中的什么位置?我认为它是一个参考并存储在 中refs,对吗?


传奇:

  • C1、C2 - 提交
  • Idx - 索引
  • WD——工作目录
  • 虚线和虚线边框 => 免费用于垃圾收集

重新制作的图像

在此处输入图片说明

tor*_*rek 5

“之前git stash”和“之后git stash”图本质上是正确的(有两个新提交,不在任何分支上,由refs/stashaka指向stash@{0})。该图中缺少的是索引和工作树本身被重置,就像git reset --hard它一样 - 事实上,使用 git reset --hard-after git stash

“之后git stash branch”图[编辑以匹配新图]更难绘制,但是:git stash branch使用idxwd提交来恢复索引和工作树的状态,然后将它们完全refs/stash. 这两个提交现在根本没有名称,因此有资格进行垃圾收集(git gc现在可以根据gc.pruneExpire您的配置在“修剪时间”方面在它们到期时立即删除它们)。新的分支名称test指向父提交,idxWD指向该提交,回到何时idx并且WD仍然保证存在。

此时立即进行新提交 ( git stash branch <name> && git commit) 将根据恢复的索引进行新提交,就像在更新后的绘图中一样。

我的 .git 目录中存储的内容在哪里?

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

我认为它是一个引用并存储在 refs 中,对吗?

是的,refs/stash是参考。该git stash代码使用(或滥用?)的引用日志条目refs/stash管理“藏匿栈”,所以无论是哈希ID的refs/stash本身,以及所有那些在任何refs/stash引用日志条目,事:他们守WD承诺活着,直接指向它,并且因此也保持idx提交( 的^2或第二个父级WD)处于活动状态(因为它可以通过WD提交访问)。