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

Bla*_*ble 18 git git-stash

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

创建

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

商店

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

假设我们正在考虑自动化脚本的情况下,做什么优点git stash creategit stash store给我在平时git stash save和朋友吗?

joe*_*dle 12

不幸的是,Andrew在上面展示的好例子并不适用于所有情况,因为:

  • 如果局部变化,然后git stash create将创建一个未引用的承诺,但它实际上并不会清除局部变化.

  • 如果没有任何本地更改,则根本不会创建提交(如BlackVegetable指出).在那种情况下,我们不应该apply在最后.

  • (并且未成年人:安德鲁忘记保留并使用由...生成的提交ID create.)

考虑到这一点,在我看来,用法应该是这样的:

# 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
Run Code Online (Sandbox Code Playgroud)

笨拙地说至少!

唉.如果我可以只git stash save --allow-empty在顶部和git stash pop底部,这将简单得多.

我想爱错.请指正!

  • 请注意,在*rebase*的特定情况下,我们实际上只需使用`git rebase --autostash`来自动执行上面的操作. (2认同)

And*_*ett 7

您可以git stash create在编写需要隐藏的脚本作为实现细节时使用,并且不想打扰用户的存储reflog.

根据接下来发生的情况,您可能(在出现错误的情况下)决定您确实想要打扰藏匿的reflog,此时您可以使用git stash store.

显然,可以用create当时的方式实现常规存储store,但我也可以想象它被用在一个假设的update-branch命令中,它做了这样的事情:

git stash create
git fetch
git rebase
git stash apply
Run Code Online (Sandbox Code Playgroud)