首先,快速说明:每个存储实际上只是一组提交,采用特定格式(“存储包”),不在任何分支上。(这里最简单的事情可能是将存储转换为分支,这使得一切变得更加简单。有关详细信息,请参阅此答案git stash branch
的部分。)
bundle 命令不支持存储吗?
这是正确的:它没有——至少,不是你试图使用它的方式。但是有一个简单的(ish)修复。
如文档中所述git bundle
,<git-rev-list-args>
论点是:
git rev-parse和git rev-list可接受的参数列表(并包含命名 ref,请参阅下面的指定参考)
(我的粗体字)。他们提到的部分继续说:
git bundle只会打包git show-ref 显示的引用:这包括头、标签和远程头。不能打包之类的引用master~1
...
尽管他们的示例使用master~1
了 ,但任何不是实际引用名称的东西都会与这个问题发生冲突,包括像stash@{1}
.
那么,如果您真的想这样做,解决方案是为哈希 ID 提供一个适当的参考名称,例如分支或标记名称。让我们在这里使用标签名称:
git tag temp-tag stash@{1}
现在您有了一个标签并可以创建一个捆绑包(或者,更简单的是,只需通过网络推送或获取标签,这样您就不需要计算适当的基础或一组基础)。为避免制作大量捆绑包,您可以提供一些适当的基础作为停止点,例如:
git bundle create foo.bundle temp-tag ^master
(假设^master
是一个适当的停止点)。
您现在可以在本地删除标签:
git tag -d temp-tag
并传输捆绑包并git fetch
在另一个系统上运行它,以在那里创建标签。(或者,再次,而不是搞乱git bundle
,只需使用网络协议(例如两台计算机之间的git://
或ssh://
之间的或服务器之间的网络协议)获取或推送标签。)
你现在有一个标签,temp-tag
,它作为一个存储。给定此标签时,常规git stash
命令可以正常工作:
git stash apply temp-tag
例如。删除标签会删除这组提交的名称。