【问题标题】:git-stash vs. git-branchgit-stash 与 git-branch
【发布时间】:2008-09-02 14:22:44
【问题描述】:

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

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

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

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

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


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

【问题讨论】:

    标签: git


    【解决方案1】:

    'stash' 将未提交的、“dirty”工作副本中的内容隐藏起来,为您留下一个干净的工作副本。

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

    git stash branch <branchname> [<stash>]
    

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

    因此,如果您还没有提交到“错误”分支,stash 非常有用。

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

    【讨论】:

    • 一件让我很头疼的事情……你能写出 [] 的实际样子吗?他们在文档中以该符号表示,但不清楚应该是 1 还是 @{1} 或什么。
    • 如果要引用特定的存储“N”,请使用 stash@{N}
    • 查看git stash list 了解您的存储名称。
    • Gregg,是的,你可以: git stash save(你的存储名称)。如果您经常使用它,它会变得更加有用,这样您就知道每个存储库的作用。您可以使用 git stash show -p (name) 向您显示存储的补丁。
    • 另外,git stash show -u 显示存储与工作副本的差异。
    【解决方案2】:

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

    存储您当前的更改

    $ 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
    

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

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

    【讨论】:

    • 比所谓的“最佳”答案更有帮助的资源...(尽管最佳答案确实说明了很多,但在完整使用方面存在一些混淆)
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 你会在没有给它们有用的名字的情况下创建分支吗?如果不是,那么我不明白你为什么不对 stash 做同样的事情。如果您真的想知道它们包含什么,您只需使用 git-stash show 来显示哪些文件已更改,或者使用 git-stash apply 和 git-diff 来查看实际差异。减少藏匿处与控制树枝一样。
    • 其实可以使用git stash drop [&lt;stash&gt;]删除单个stash
    • 没错,git 已经有 git stash drop 很长时间了。现在使用的 PITA 少了很多。我现在每天都使用它,甚至在很长一段时间内都使用它。
    【解决方案4】:

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

    与git stash 的主要区别:

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

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2011-12-02
      • 1970-01-01
      • 2018-10-18
      • 2012-09-10
      • 1970-01-01
      • 2017-11-25
      • 2013-02-23
      相关资源
      最近更新 更多