【问题标题】:What is the intended use-case for git stash?git stash 的预期用例是什么?
【发布时间】:2013-12-30 11:50:45
【问题描述】:

如果我在分支 A 上工作,并且在准备好在分支 A 上提交之前突然需要在分支 B 上工作,我将我的更改存储在 A 上,签出 B,在那里完成我的工作,然后签出 A 并应用存储。

如果我在 A 上工作并且我想在当天停止工作,我应该把我的工作藏起来,然后在第二天(当我恢复工作时)应用它,还是应该让事情保持原样——未提交修改工作目录中的文件?我不明白为什么在这种情况下我需要使用 stash,除非有一些安全优势。

另外,另一个场景:我在工作和在家工作。如果我想回家时还没有准备好提交,我可以将我的工作存储起来,将其推送到 GitHub,然后将其拉回家里吗?

【问题讨论】:

  • 很大程度上取决于您的公司政策(如果有)。你将如何选择“接受”的答案?
  • 这个问题的措辞只是征求意见(我应该使用 git this 方式还是 that 方式?),因此应该关闭或编辑.

标签: git git-stash


【解决方案1】:

Stash 只是一种方便的方法。由于分支在 git 中非常便宜且易于管理,因此我个人几乎总是更喜欢创建一个新的临时分支而不是存储,但这主要是个人喜好问题。

我喜欢隐藏的一个地方是,如果我发现我在上次提交中忘记了某些内容,并且已经开始在同一分支中处理下一个提交:

# Assume the latest commit was already done
# start working on the next patch, and discovered I was missing something

# stash away the current mess I made
git stash save

# some changes in the working dir

# and now add them to the last commit:
git add -u
git commit --amend

# back to work!
git stash pop

【讨论】:

  • 您添加的丢失的东西是否会在您取消存储后合并到存储中? (我仍然对时间线在 git 中的工作方式感到不安——我假设你正在覆盖历史??)
  • @KikiJewell 弹出的更改应用于索引 - 它们未提交。因此,如果您 git stash pop 两次,您将失去这两个变更集之间的区别。
  • 截至 2017 年 10 月下旬,关于 Git 邮件列表的广泛讨论,其中命令 git stash save 已被弃用,有利于现有的替代方案 git stash push。主要原因是git stash push 引入了隐藏选定pathspecs 的选项,git stash save 不支持。
  • @Mureinik,你如何看待新分支与 git stash 分支?
  • @Pacerier 正如我在第一段中所说,我几乎总是更喜欢创建一个新分支,但这可能更像是一种习惯力量,而不是任何合理的技术推理。
【解决方案2】:

我将分三段来回答。

第 1 部分:

git stash(将未提交的更改保存在“stash”中。注意:这会从工作树中删除更改!)

git checkout some_branch(更改为预期的分支——在本例中为some_branch

git stash list(列出存储)

你可以看到:
stash@{0}: WIP on {branch_name}: {SHA-1 of last commit} {last commit of you branch}
stash@{ 1}:主设备上的 WIP:085b095c6 测试修改

git stash apply(将存储应用到当前分支的工作树)

git stash apply stash@{12}(如果您有很多 stash,您可以选择要应用的 stash - 在这种情况下,我们应用 stash 12

git stash drop stash@{0}(从存储列表中删除——在本例中为存储0

git stash pop stash@{1}(应用选定的存储并将其从存储列表中删除)

第 2 部分:
您可以使用此命令隐藏您的更改,但这不是必需的。
您可以在没有存储的情况下在第二天继续。
此命令用于隐藏您的更改并在不同的分支上工作,或用于实现您的代码的某些实现并保存在没有分支的存储库中并提交您的自定义案例!
稍后您可以使用一些 stash 并检查哪个更好。

第 3 部分:
Stash 命令用于本地隐藏您的更改。
如果你想远程工作,你必须提交并推送。

【讨论】:

    【解决方案3】:

    主要思想是

    将更改存储在脏工作目录中

    因此,Basallly Stash 命令保留一些您暂时不需要或想要的更改;但你可能需要它们。

    当你想记录当前状态时使用git stash 工作目录和索引,但想回到干净 工作目录。该命令将您的本地修改保存起来 并恢复工作目录以匹配 HEAD 提交。

    【讨论】:

      【解决方案4】:

      您可以使用以下命令:

      • 保存未提交的更改

        git stash

      • 列出您保存的存储

        git stash list

      • 应用/取回 x 为 0,1,2 的未提交更改...

        git stash apply stash@{x}

      注意:

      • 应用存储并将其从存储列表中删除

        git stash pop stash@{x}

      • 应用存储并将其保存在存储列表中

        git stash apply stash@{x}

      【讨论】:

        【解决方案5】:

        我知道 StackOverflow 不是基于意见的答案的地方,但我实际上对何时搁置更改有一个很好的意见。

        您不想提交实验性更改

        当您在工作区/工作树中进行更改时,如果您需要执行任何基于分支的操作​​,例如合并、推送、提取或拉取,您必须处于一个干净的提交点。因此,如果您有工作区更改,则需要提交它们。但是,如果您不想提交它们怎么办?如果他们是实验性的呢?你不希望你的提交历史的一部分?推送到 GitHub 时不想让别人看到的东西?

        您不想通过硬重置丢失本地更改

        在这种情况下,您可以进行硬重置。但是,如果您进行硬重置,您将丢失所有本地 working tree 更改,因为所有内容都会被覆盖到上次提交时的位置,您将丢失所有更改。

        所以,至于“你什么时候应该隐藏”的答案,答案是当你需要用同步的工作树/索引/提交回到一个干净的提交点,但你不想失去你的过程中的局部变化。只需将您的更改搁置起来,您就可以了。

        一旦你完成了你的存储,然后合并、拉取或推送,你只需 stash pop or apply 就可以回到你开始的地方。

        Git 存储和 GitHub

        GitHub 不断添加新功能,但截至目前,有一种方法可以在其中保存存储空间。同样,存储的想法是它是本地的和私有的。如果没有对您的工作站进行物理访问,其他任何人都无法窥视您的藏匿处。有点像 git reflog 是私有的,而 git log 是公共的。如果它被推送到 GitHub,它可能不会是私有的。

        一个技巧可能是对您的工作区进行差异化,将差异检查到您的 git 存储库中,提交然后推送。然后你可以从家里拉一下,拿到差异,然后放松它。但这是实现这些结果的一种相当混乱的方式。

        git diff > git-dif-file.diff
        

        【讨论】:

          【解决方案6】:

          如果您在工作副本(而不是暂存区域)中有更改时点击git stash,git 将创建一个隐藏对象并推送到隐藏堆栈(就像您所做的git checkout -- . 但你不会' t 丢失更改)。稍后,您可以从堆栈顶部弹出。

          【讨论】:

          • 我认为它也是来自Index。这是来自 Git 文档:当您想要记录工作目录和索引的当前状态时,请使用 git stash,
          【解决方案7】:

          stash 命令将存储您自上次提交以来所做的任何更改。在你的情况下,如果你要在第二天继续工作,就没有理由藏起来。我只会使用 stash 撤消您不想提交的更改。

          【讨论】:

          • 不,git stash 不会更改您的分支。它尤其不会“恢复”任何已提交的更改。它只会(临时)丢弃文件上任何未提交的更改。 - 可能看起来很挑剔,但这类词在 git 上下文中具有非常特殊的含义。你真的不应该把它们混在一起。
          • 感谢您指出这一点。我相应地改变了我的答案。
          • 在 git 中,“分支”被定义为一系列提交。 git stash 不会触及任何提交,因此根本不会修改任何分支。它不会从分支中“删除”任何东西,也不会以任何方式“重置”它。分支保持不变,只有工作树中的文件发生了变化。 - 这是两个完全不同的东西。
          • 它不会丢弃而是“隐藏”您的更改! Git 为 stash 维护一个 LIFO 结构,所以一个 stash 实际上是一个 push,你可以从它的顶部弹出。 “丢弃”这个词意味着你会失去任何东西,但你不会。
          【解决方案8】:

          主要用例已在上述答案中提供。

          stash 的一个用例是,如果分支上的更改与 stash 中的更改不同,则在弹出或应用存储时可能会遇到冲突。

          您可以使用git stash branch 创建一个新分支来应用您隐藏的更改。例如,

          git stash branch master_stash_newBranch stash@{1}
          

          这会根据您创建存储的提交检出一个新分支,然后将您隐藏的更改弹出到该分支上。

          【讨论】:

            【解决方案9】:

            您可以使用两种方式来存储和启动或从上游创建新分支。 Stash 是保存撤消重做更改的更方便的方式。

            【讨论】:

              猜你喜欢
              • 2017-11-24
              • 1970-01-01
              • 2021-11-24
              • 1970-01-01
              • 1970-01-01
              • 2016-01-04
              • 2013-05-31
              • 2014-04-16
              • 2019-04-13
              相关资源
              最近更新 更多