95

之前的 Git 问题中,Daniel Benamy 谈到了 Git 中的工作流程:

我正在研究master并提交了一些东西,然后我决定暂停这项工作。我备份了一些提交,然后从我开始我的垃圾工作之前分支。

他想在不丢失当前更改的情况下将自己的工作状态恢复到之前的时间点。所有的答案都以各种方式围绕着,比如

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

这比起来git stash怎么样?当似乎所有事情git stash都已经通过分支处理 时,我试图看看这里有什么不同的用例,我有点困惑……</p>


@Jordi Bunster:谢谢,这一切都清楚了。我想我会认为“隐藏”就像一个轻量级的、无名的分支。所以任何 stash 可以做的事情,branch 也可以,但是需要更多的词。好的!

4

4 回答 4

111

'stash' 将工作副本上未提交的、“”的东西藏起来,留下一个干净的工作副本。

它根本没有分支。然后,您可以将存储应用到任何其他分支的顶部。或者,从 Git 1.6 开始,您可以执行以下操作:

git stash branch <branchname> [<stash>]

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

因此,如果您还没有提交到“错误的”分支,那么 stash 会非常有效。

如果您已经承诺,那么您在问题中描述的工作流程是一个更好的选择。顺便说一句,你是对的:Git 非常灵活,而这种灵活性带来了重叠的功能。

于 2008-09-02T15:54:59.953 回答
49

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

存储您当前的更改

$ 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

如果您想清除所有的存储,请运行“清除”命令:

$ git stash clear

很可能是您不经常使用 stash。如果您只想快速存储更改以稍后恢复它们,则可以省略存储 ID。

$ git stash
...
$ git stash pop

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

我还在我的博客上发布了一个更深入的版本

于 2009-06-05T12:50:57.587 回答
11

我总是对 git stash 保持警惕。如果你藏匿几次,事情往往会变得一团糟。git stash list 将显示您创建的存储的编号列表,如果您提供了消息,则显示它们......但问题在于您无法清理存储,除非使用残酷的 git stash clear (将它们全部删除) . 因此,除非您总是始终如一地为您的 stash 提供超级描述性消息(有点违背 stash 的理念),否则您最终会得到一堆难以理解的 stash。

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

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

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

于 2008-09-25T17:53:27.220 回答
3

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

主要区别git stash

  • git stash狭窄地保存脏 git 状态(修改的文件和在索引中添加的文件),而git-bottle旨在保存与 不同的所有内容HEAD,并以保留方式区分已修改、已修改和未添加、未添加、未合并路径,以及完整的变基/合并状态(仅.gitignore不保存路径)。
  • git stash保存以存储您需要单独跟踪的对象。如果我在 2 周前隐藏了一些东西,我可能不记得它,而将其git-bottle保存为对当前分支的暂定提交。反向动作git-unbottle相当于git stashpop。可以在存储库之间推送和共享这些提交。这对于远程构建很有用,您在远程服务器中有另一个存储库仅用于构建或与其他人协作解决冲突。
于 2015-07-19T04:55:05.760 回答