只收藏Git中没有上演的变化

时间:2011-10-04 16:05:04

标签: git git-stash

我想做以下工作流程:

  1. 向舞台添加更改。
  2. 存储未暂存的所有其他更改。
  3. 用舞台上的东西做一些事情(即构建,运行测试等)
  4. 应用藏匿处。
  5. 有没有办法做第2步?

    实施例

     echo "123" > foo
     git add foo # Assumes this is a git directory
     echo "456" >> foo
     git stash
     cat foo # Should yield 123
    

11 个答案:

答案 0 :(得分:236)

git stash save有一个选项--keep-index可以完全满足您的需求。

所以,运行git stash save --keep-index

答案 1 :(得分:27)

git stash save --keep-index

另外,Re:

  

为什么不在升级后提交更改? - 申

答:因为你应该经常签入经过测试的代码:)这意味着你需要用运行测试只有你要提交的更改

所有这一切除了当然,作为一名经验丰富的程序员,你有天生的冲动来测试和审查那些变化 - 只有部分开玩笑 < / p>

答案 2 :(得分:23)

这可以通过3个步骤完成:保存分阶段更改,隐藏其他所有内容,使用暂存更改恢复索引。这基本上是:

git commit -m 'Save index'
git stash push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^

这将完全符合您的要求。

答案 3 :(得分:11)

使用git version 2.7.4您可以:

git stash save --patch

git会要求您将更改添加到藏匿处 然后,您只需回答yn

您可以像往常一样恢复工作目录:

git stash pop

或者,如果您希望保存已存储的更改:

git stash apply

答案 4 :(得分:10)

仅在Git中存储工作树(未分阶段的更改)比应有的困难。接受的答案会存储未分阶段的更改,但也会存储已分阶段的更改(并使它们也处于分阶段),这是您很少想要的。

此别名很好用:

stash-working = "!f() { \
  git commit --quiet -m \"temp for stash-working\" && \
  git stash push \"$@\" && \
  git reset --quiet --soft HEAD~1; }; f"

它将临时提交暂存的更改,从其余更改创建存储(并允许将其他参数(例如--include-untracked--message作为别名参数传递),然后将临时提交重置为找回分阶段的变更。

它与@Simon Knapp的answer类似,但有一些细微差别-它在执行的临时操作上使用--quiet,并且为隐藏{{1 }},而不是对push进行硬编码,它确实将-m添加到了最终的重置中,以便索引保持在开始时的状态。

关于仅存储分阶段的更改(别名--soft)的相反问题,请参见this answer

答案 5 :(得分:5)

扩展之前的答案,我有时会进行一系列复杂的更改,但希望首先进行单独的更改。例如,我可能已经发现了一个错误或其他错误的代码,我想在我的分阶段更改之前修复。一条可能的路线是:

首先存放一切,但保持分阶段的更改

  

$ git stash save --keep-index [--include-untracked]

现在也单独存储分阶段的更改

  

$ git stash save

进行修改;和测试;提交他们:

  

$ git add [--interactive] [--patch]

     

$ git commit -m&#34; fix ...&#34;

现在恢复之前暂存的更改:

  

$ git stash pop

解决所有冲突,请注意,如果存在冲突,git将会应用,但会删除该顶级存储条目。

(...然后提交暂存的更改,并恢复所有其他更改的存储,并继续......)

答案 6 :(得分:2)

另一个提示,与问题有关:

使用

有效存储未分级的更改时
  

$ git stash save --keep-index

你可能希望给藏匿信息一个消息,这样当你做git stash list时,你所隐藏的东西就更明显了,特别是如果你通过进一步的保存来遵循那个藏匿操作。例如

  

$ git stash save --keep-index“还没有上演”

(尽管实际上它确实包含了其他答案中提到的所有更改)。

例如,上面可能会紧接着:

  

$ git stash save“功能X的暂存更改”

请注意,不能然后使用

  

$ git stash apply“stash @ {1}”###✘并不是你想做的事情

仅恢复未分级的更改。

答案 7 :(得分:2)

我使用一个别名,该别名接受一个字符串用作存储项的消息。

mystash = "!f() { git commit -m hold && git stash push -m \"$1\" && git reset HEAD^; }; f"

哪个:

  • 提交索引中的所有内容,
  • 隐藏工作树中的更改(当然可以添加-u-a),
  • 将最后一次提交重设回工作尝试中(可能想使用--soft将其保留在索引中)。

答案 8 :(得分:1)

要将未标记(未添加到提交)的文件添加到存储中,请运行以下命令:

git stash -k

然后,您可以提交已暂存的文件。之后,您可以使用以下命令取回最后存放的文件:

git stash pop

答案 9 :(得分:1)

Git没有命令仅存储您未分段的更改。

但是,Git允许您指定要隐藏的文件。

git stash push --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb

如果只想隐藏这些文件中的特定更改,请添加--patch选项。

git stash push --patch --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb

通过--include-untracked选项可以隐藏未跟踪的文件。

git stash push --include-untracked --message 'Untracked files' -- app/controllers/widgets_controller.rb test/controllers/widgets_controller_test.rb

运行git help stash(或man git-stash)以获取更多信息。

注意:如果您未进行的分阶段更改比较混乱,@alesguzik's answer可能会更容易。

答案 10 :(得分:0)

该命令的现代形式是git stash push [--] [<pathspec>...],因为Git 2.16+(git stash save is deprecated

您可以将其与通配符形式结合使用,例如:

git stash push --all --keep-index ':(glob)**/*.testextension' 

但这不适用于Windows的Git,直到Git 2.22(2019年第二季度),再考虑考虑issue 2037(而不是shell脚本),请参见git stash has been re-implemented in C

请参见commit 7db9302Thomas Gummerer (tgummerer)(2019年3月11日)。
请参见commit 1366c78commit 7b556aaJohannes Schindelin (dscho)(2019年3月7日)。
(由Junio C Hamano -- gitster --commit 0ba1ba4中合并,2019年4月22日)

  

内置stash:再次处理:(glob)路径规范

     

在将路径规范列表传递到git add时,我们需要   请小心使用原始格式,而不要使用pathspec的解析格式。

     

这有所作为,例如打电话时

git stash -- ':(glob)**/*.txt'
     

其中原始格式在解析时包含:(glob)前缀   表格没有。

     

但是,在内置的git stash中,我们传递了已解析(即不正确)的表单,并且git add会因错误消息而失败:

fatal: pathspec '**/*.txt' did not match any files
     

git stash从工作树中删除更改的阶段,即使refs/stash实际上已成功更新。