git-stash与git-branch

在之前的Git问题中,Daniel Benamy正在讨论Git中的工作流程:

我正在做主人并且做了一些事情,然后我决定把这项工作搁置一边。 我支持了一些提交,然后在我开始我的垃圾工作之前分支。

他希望将自己的工作状态恢复到以前的某个时间点而不会失去他目前的变化。 所有答案都以各种方式围绕着类似的东西

git branch -m master crap_work
git branch -m previous_master master

这与git stash相比如何? 我有点困惑,试图看看这里的不同用例,似乎所有git stash所做的一切已经由分支处理...


@Jordi Bunster:谢谢,这清楚了。 我想我会认为“藏匿”就像一个轻量级,无名的分支。 所以任何藏匿都可以做,分支也可以,但更多的话。太好了!

Will Robertson asked 2019-09-11T09:56:38Z
4个解决方案
108 votes

'stash'将未提交的,“脏”的东西带到你的工作副本上,然后把它藏起来,给你一份干净的工作副本。

它根本没有真正的分支。 然后,您可以将存储应用于任何其他分支的顶部。 或者,从Git 1.6开始,您可以:

git stash branch <branchname> [<stash>]

在一个命令中全部应用存储在新分支的顶部。

所以,如果你还没有致力于“错误的”分支,那么stash的效果很好。

如果您已经提交,那么您在问题中描述的工作流程是更好的选择。 顺便说一句,你是对的:Git非常灵活,并且具有这种灵活性,功能重叠。

Jordi Bunster answered 2019-09-11T09:57:20Z
48 votes

还原您的存储时,将重新应用您的更改,并继续处理您的代码。

隐藏当前的更改

$ git stash save 
Saved "WIP on master: e71813e..."

您还可以拥有多个藏匿处。 存储就像堆栈一样工作。 每次保存新的存储时,它都会置于堆栈顶部。

$ git stash list
stash@{0}: WIP on master: e71813e..."

注意stash@{0}部分? 那是你的藏匿ID。 你以后需要它来恢复它。 我们现在就这样做。 存储ID随着您的每个存储而变化。 stash @ {0}指的是你最后一次藏匿。

申请藏匿

$ git stash apply stash@{0}

您可能会注意到在应用它之后存储仍然存在。 如果您不再需要它,可以放弃它。

$ git stash drop stash@{0}

或者,因为存储就像一个堆栈,你可以弹出你保存的最后一个存储:

$ git stash pop

如果你要擦去所有的藏匿处,请运行'clear'命令:

$ git stash clear

很可能你不经常使用藏匿处。 如果您只想快速存储更改以便以后还原它们,则可以省略隐藏ID。

$ git stash
...
$ git stash pop

在将其用于一些非常重要的工作之前,请随意尝试藏匿。

我在博客上发布了更深入的版本。

Ariejan answered 2019-09-11T09:58:49Z
8 votes

我总是对git stash保持警惕。 如果你藏了几次,事情往往会变得混乱。 git stash list会显示你创建的stashes的编号列表,如果你提供了它们就会显示消息......但问题在于你无法清除stashes,除非有一个残酷的git stash clear(将它们全部删除)。 因此,除非你总是肛门为你的藏物提供超级描述性的信息(有点违背藏匿者的哲学),你最终会得到一堆难以理解的藏匿处。

我知道的唯一方法是弄清楚哪一个是使用gitk --all并发现了藏匿处。 至少这可以让你看到创建存储的提交,以及该存储中包含的所有内容的差异。

请注意,我正在使用git 1.5.4.3,我认为1.6添加了git stash pop,我想这将应用所选的存储并将其从列表中删除。 这似乎更清洁。

现在,我总是试图分支,除非我绝对肯定我会在同一天回到那个藏匿处,即使在一小时内也是如此。

webmat answered 2019-09-11T09:59:34Z
3 votes

如果您寻找的工作流程可能比git stash更合适,您可能需要查看git-bottle。 它是一个实用程序,用于保存和恢复各种git工作状态作为正常的git提交,有效地快照工作树的当前和相关状态以及git status下显示的所有各种文件状态。

git stash的主要区别:

  • git stash狭义地保存脏git状态(已修改的文件,并在索引中添加了文件),而git-bottle旨在保存与git-unbottle不同的所有内容,并且它以修改,修改和未添加,未添加之间的保留方式区分 未合并的路径,以及完整的rebase / merge状态(仅保存git stash下的路径)。
  • git stash保存到需要单独跟踪的存储对象。 如果我在2周前藏匿某些内容我可能不会记住它,而git-bottle则保存为当前分支的暂定提交。 反向动作是git-unbottle,相当于git stash pop。 可以在存储库之间推送和共享这些提交。 这对于远程构建非常有用,在远程构建中,您在远程服务器中有另一个存储库,仅用于构建或与其他人协作解决冲突。
Dan Aloni answered 2019-09-11T10:00:20Z
translate from https://stackoverflow.com:/questions/39651/git-stash-vs-git-branch