从git-scm的文档中,有两个git stash命令提到与脚本相关,但不是一般用途:
创建
创建一个存储(它是一个常规提交对象)并返回其对象名,而不将其存储在ref命名空间中的任何位置。这对脚本非常有用。它可能不是你想要使用的命令;见上面的“保存”。
商品
在stash ref中存储通过git stash create(这是一个悬空的合并提交)创建的给定存储,更新存储reflog。这对脚本非常有用。它可能不是你想要使用的命令;见上面的“保存”。
假设我们正在考虑自动脚本的上下文,git stash create
和git stash store
给我的优点是git stash save
和朋友?
答案 0 :(得分:11)
不幸的是,Andrew在上面展示的好例子并不适用于所有情况,因为:
如果是本地更改,那么git stash create
将创建一个未引用的提交,但它实际上无法清除本地更改。
如果不是任何本地更改,那么它根本不会创建提交(如BlackVegetable指出的那样)。在这种情况下,我们最后不应apply
。
(并且未成年人:安德鲁忘记保留并使用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
,那就简单得多了。
我很想错。请纠正我!
答案 1 :(得分:5)
当您编写需要隐藏的脚本作为实施细节时,您可以使用git stash create
,并且您不想打扰用户的存储日志。
根据接下来发生的情况,您可能(在出现错误的情况下)决定您确实想要打扰藏匿日志,此时您可以使用git stash store
。
显然,可以使用create
然后store
来实现常规存储,但我也可以想象它在假设的update-branch
命令中使用,它执行类似这样的操作:
git stash create
git fetch
git rebase
git stash apply