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

时间:2017-10-04 22:18:00

标签: git visualization git-stash

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

enter image description here

这个可视化是否正确?

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

我的.git目录中存储的存储区在哪里?我认为它是一个引用并存储在refs中,对吧?

图例:

  • C1,C2 - 提交
  • Idx - 指数
  • WD - 工作目录
  • 虚线和虚线边框=>免费垃圾收集

返工图片

enter image description here

1 个答案:

答案 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使用idxwd提交来恢复索引和工作树的状态,然后完全删除它们来自refs/stash。这两个提交现在根本没有名称,因此有资格进行垃圾收集(git gc现在可以在它们到期后立即删除它们,根据{"修剪时间",基于{{1在您的配置中)。新分支名称gc.pruneExpire指向testidx指向的父提交,当{{​​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提交到达)。