git-stash与git-branch

时间:2008-09-02 14:22:44

标签: git

previous Git question中,Daniel Benamy在谈论Git中的工作流程:

  

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

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

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

这与git stash相比如何?我有点困惑,试图看看这里的不同用例,当似乎像所有git stash所做的那样已经通过分支来处理...


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

4 个答案:

答案 0 :(得分:108)

'stash'会将未提交的“”内容放在您的工作副本上,然后将其藏起来,留下干净的工作副本。

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

git stash branch <branchname> [<stash>]

在一个新分支的顶部应用存储,只需一个命令。

所以,如果你还没有提交“错误的”分支,stash的效果很好。

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

答案 1 :(得分:48)

当您恢复存储时,会重新应用您的更改并继续处理您的代码。

隐藏您当前的更改

$ 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

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

I also have a more in-depth version of this posted on my blog

答案 2 :(得分:8)

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

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

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

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

答案 3 :(得分:3)

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

git stash的主要区别:

  • git stash以简单的方式保存脏git状态(已修改的文件,并在索引中添加了文件),而git-bottle旨在保存与{{不同的一切 1}},它区分了修改,修改和未添加,未添加,未合并路径之间的保留方式,以及完整的rebase / merge状态(仅保存HEAD下的路径)。
  • .gitignore保存到您需要单独跟踪的存储对象。如果我在2周前藏匿了某些东西,我可能不会记住它,而git stash暂定提交保存到当​​前分支。反向操作是git-bottle,相当于git-unbottle pop。可以在存储库之间推送和共享这些提交。这对于远程构建非常有用,在远程构建中,您在远程服务器中有另一个存储库,仅用于构建或与其他人协作解决冲突。