git-stash与git-branch

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

我当时在做主人,做了一些事情,然后决定暂时搁置这项工作。 我支持了一些提交,然后从我开始我的垃圾工作之前分支。

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

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

这与git stash相比如何? 我有点困惑,试图看看什么是不同的用例,当它看起来像所有的东西git stash不会被分支处理…


@ Jordi Bunster :谢谢,这清除了事情。 我想我会认为“存储”像一个轻量级的,无名的分支。 所以任何东西都可以做,分支可以,但更多的话。 太好了!

“藏匿”将工作副本上的未经处理的“ ”东西拿走,并将其存储起来,留下干净的工作副本。

它根本不分支。 然后,您可以将存储应用于任何其他分支之上。 或者,从Git 1.6开始,你可以这样做:

 git stash branch <branchname> [<stash>] 

在一个新的分支上应用藏匿,所有在一个命令。

所以,如果你还没有犯下“ 错误 ”的分支,那么存储就很好用了。

如果您已经承诺,那么您在问题中描述的工作stream程是更好的select。 顺便说一下,你是对的:Git非常灵活,并且具有这种灵活性的重叠function。

当你恢复你的存储,你的改变重新申请,你继续处理你的代码。

隐藏你目前的变化

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

你也可以有多个藏匿处。 储藏箱就像一个堆栈。 每次你保存一个新的藏匿,它被放在堆栈顶部。

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

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

申请藏匿

 $ git stash apply stash@{0} 

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

 $ git stash drop stash@{0} 

或者,因为藏匿行为像一个堆栈,你可以popup你保存的最后一个藏匿:

 $ git stash pop 

如果你想擦除所有的包装,运行“清除”命令:

 $ git stash clear 

这很可能是你不经常使用的。 如果您只想快速保存更改以便稍后恢复,则可以省略隐藏ID。

 $ git stash ... $ git stash pop 

在一些非常重要的工作中使用它之前,请随时尝试使用它。

我的博客上还贴出了更深入的版本 。

我总是警惕git藏匿。 如果你藏了几次,事情就会变得混乱。 git的藏匿清单将显示您创build的藏有编号的列表,并提供消息,如果你提供他们…但问题在于,你不能清理存储,除非一个残酷的git存储清除(这将其全部删除) 。 所以,除非你总是肛门给你的藏品提供超级描述信息(有点违背隐藏的哲学),你最终会得到一堆难以理解的藏品。

我知道唯一的方法来找出哪一个是使用gitk – 所有和发现的藏身之处。 至less这可以让你看到什么提交隐藏创build,以及包含在该隐藏的一切的差异。

请注意,我使用的是git 1.5.4.3,我认为1.6会添加git stash pop,我猜会应用选中的stash 并将其从列表中删除。 这似乎更清洁。

现在,我总是试图分支,除非我是绝对肯定的,即使在一个小时内,我也会在同一天回到那个仓库。

如果你寻找一个可能比git存储更适合的工作stream程,你可能想看看git-bottle 。 这是一个工具,用于保存和恢复各种git工作状态作为正常的git提交,有效地快照您工作树的当前和相关的状态,以及在git状态下显示的所有各种文件状态。

git stash主要区别:

  • git stash保存脏的git状态狭窄(修改文件,并在索引中添加文件),而git-bottledevise保存所有不同于HEAD ,并在修改,修改和不添加之间的保留方式区分,未添加,未合并的path以及完整的重定位/合并状态(仅保存.gitignore下的path)。
  • git stash保存对象,你需要跟踪分开。 如果我在2星期前隐藏了一些东西,我可能不记得它,而git-bottle则会保存为当前分支的临时提交 。 相反的动作是git-unbottle ,这相当于git stash pop。 有可能在存储库之间推送和共享这些提交。 这对于远程构build很有用,在远程构build中,远程服务器中只有另一个存储库用于构build,或者与其他人协作解决冲突。