从git-scm的文档中,有两个 git stash 命令提到了与脚本编写的相关性,但不是一般用途:
创建
创建一个存储(这是一个常规提交对象)并返回其对象名称,而不将其存储在 ref 命名空间中的任何位置。这对于脚本很有用。这可能不是您想要使用的命令;请参阅上面的“保存”。
商店
将通过 git stash create 创建的给定存储(这是一个悬空合并提交)存储在存储引用中,更新存储引用日志。这对于脚本很有用。这可能不是您想要使用的命令;请参阅上面的“保存”。
假设我们正在考虑自动化脚本的上下文,那么与通常的
git stash create
和朋友相比,git stash store
和 git stash save
给我带来了哪些优势?
不幸的是,安德鲁上面展示的好例子并不适用于所有情况,因为:
如果有有本地更改,那么
git stash create
将创建一个未引用的提交,但它实际上不会清除本地更改。如果没有任何本地更改,那么它根本不会创建提交(正如 BlackVegetable 指出的那样)。在这种情况下,我们最后不应该
apply
。(还有一点:Andrew 忘记保留和使用
create
生成的提交 ID。)考虑到这一点,在我看来,用法应该是这样的:
# Save the local changes, keep a reference to them, and clear them
stashed_commit="$(git stash create)"
git reset --hard
# Do your thing
git fetch
git rebase
# If there were local changes, then restore them
if [ -n "${stashed_commit}" ]
then git stash apply "${stashed_commit}"
fi
至少可以说不方便!
唉。如果我可以在顶部使用
git stash save --allow-empty
,在底部使用 git stash pop
,那就简单多了。
我很乐意犯错。请指正!
当您编写需要存储为实现细节的脚本并且您不想打扰用户的存储引用日志时,可以使用
git stash create
。
根据接下来发生的情况,您可能(例如,在发生错误的情况下)决定您确实想要扰乱存储刷新日志,此时您可以使用
git stash store
。
显然,常规存储可以通过
create
然后 store
来实现,但我也可以想象它被用在一个假设的 update-branch
命令中,执行如下操作:
git stash create
git fetch
git rebase
git stash apply
Git 2.43(2023 年第 4 季度)阐明了
git stash store
与 git stash create
的关系:
git stash store
(man) 创建的随机提交提供“git stash create
”(man) 现在会出错。
请参阅 Junio C Hamano (gitster
)
的commit d9b6634(2023 年 10 月 11 日)。
gitster
-- 合并于 commit 626f689,2023 年 10 月 23 日)
:小心我们储存的东西stash
"(man) 旨在存储git stash store
(man) 生成的内容,因为这两个是面向“git stash create
“(man)命令。git stash save
”的最终用户的实现细节
尽管有明确的记录,但用户会尝试诸如“”HEAD之类的愚蠢事情来使他们的藏品无法使用。git stash store
”(man)不允许删除这样的存储条目,“git stash drop
”(man)将是唯一的方法从这样的不幸中恢复过来。git stash clear
重用允许“drop”避免处理此类存储条目的逻辑,以教导“store”避免首先存储不是存储条目的对象。
错误信息:
store called with non-stash commit