git stash create和git stash store的目的是什么?

时间:2015-02-20 18:41:50

标签: git git-stash

git-scm的文档中,有两个git stash命令提到与脚本相关,但不是一般用途:

  

创建

     

创建一个存储(它是一个常规提交对象)并返回其对象名,而不将其存储在ref命名空间中的任何位置。这对脚本非常有用。它可能不是你想要使用的命令;见上面的“保存”。

     

商品

     

在stash ref中存储通过git stash create(这是一个悬空的合并提交)创建的给定存储,更新存储reflog。这对脚本非常有用。它可能不是你想要使用的命令;见上面的“保存”。

假设我们正在考虑自动脚本的上下文,git stash creategit stash store给我的优点是git stash save和朋友?

2 个答案:

答案 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