我想做以下工作流程:
有没有办法做第2步?
实施例
echo "123" > foo
git add foo # Assumes this is a git directory
echo "456" >> foo
git stash
cat foo # Should yield 123
答案 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
会要求您将更改添加到藏匿处
然后,您只需回答y
或n
您可以像往常一样恢复工作目录:
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 7db9302的Thomas Gummerer (tgummerer
)(2019年3月11日)。
请参见commit 1366c78的commit 7b556aa,Johannes 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
实际上已成功更新。