我想执行以下工作流程:
- 向舞台添加更改。
- 存放所有其他尚未上演的更改。
- 在阶段中做一些事情(例如,构建,运行测试等)
- 应用藏匿处。
有步骤2的方法吗?
例
echo "123" > foo
git add foo # Assumes this is a git directory
echo "456" >> foo
git stash
cat foo # Should yield 123
我想执行以下工作流程:
有步骤2的方法吗?
例
echo "123" > foo
git add foo # Assumes this is a git directory
echo "456" >> foo
git stash
cat foo # Should yield 123
Answers:
git stash save
有一个选项--keep-index
可以满足您的需求。
因此,运行git stash save --keep-index
。
save
同git stash
。也许是我中的程序员坚持用apply / pop来尊重对称性。:)
git stash save
在于,它也将已经分阶段进行的更改也保留在工作副本中。在上面的工作流程中,这是可以正常工作的,因为您只是将隐藏应用在已经具有隐藏存储更改一半的本地副本之上(git非常聪明,可以忽略)。但是,如果在重新应用存储之前编辑代码,则在应用时可能会看到合并冲突。菲
git commit --ammend
如果有问题就可以。
--amend
(而不是--ammend
)
这可以分3个步骤完成:保存已分阶段的更改,存储所有其他内容,使用已分阶段的更改还原索引。基本上是:
git commit -m 'Save index'
git stash push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^
这将完全满足您的要求。
-u
还会存储未跟踪的文件。
git stash save --keep-index
了很多工作。我看不出任何优势。
与git version 2.7.4
您一起可以做:
git stash save --patch
该git
会要求你添加或不更改为藏匿。
然后你就回答y
或n
您可以像往常一样还原工作目录:
git stash pop
或者,如果您想将已保存的更改保留在存储中:
git stash apply
扩展先前的答案,有时我会进行一系列复杂的更改,但是希望先提交单独的更改。例如,我可能已经发现了我想在分阶段进行的更改之前修复的错误或其他错误代码。可能采取的一种方法是:
首先隐藏所有内容,但完整保留分阶段的更改
$ git stash save --keep-index [--include-untracked]
现在也分别存储分阶段的更改
$ git stash保存
进行更改以进行修复;和测试;提交他们:
$ git add [--interactive] [--patch]
$ git commit -m“修复...”
现在,还原先前上演的更改:
$ git stash pop
解决任何冲突,并注意,如果存在冲突,git将应用但不会删除该顶部存储项。
(...然后提交暂存的更改,并恢复所有其他更改的存储,然后继续...)
在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的答案类似,但有一些细微的区别-它用于--quiet
执行的临时操作,并且可以为存储项接受任意数量的参数push
,而不是对进行硬编码-m
,并且确实会增加--soft
最终值重置,以使索引保持为开始状态。
对于仅存入阶段性更改(别名stash-index
)的相反问题,请参见此答案。
与该问题有关的另一个技巧:
当您有效地存储您未使用的更改时,使用
$ git stash save --keep-index
您可能希望给存储区一个消息,以便在执行git stash list
存储操作时,您之前存储的内容更加明显,特别是如果您通过进一步保存执行存储操作时。例如
$ git stash save --keep-index“更改尚未上演”
(尽管实际上它确实包含其他答案中指出的所有更改)。
例如,上面可能紧随其后:
$ git stash保存“功能X的分阶段更改”
但是要当心,您不能再使用
$ git stash apply“ stash @ {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的答案可能会更容易。
该命令的现代形式是git stash push [--] [<pathspec>...]
,因为Git 2.16+(git stash save
已弃用)
您可以将其与通配符形式结合使用,例如:
git stash push --all --keep-index ':(glob)**/*.testextension'
但这不适用于Windows的Git,直到Git 2.22(2019年第二季度),请参阅问题2037,考虑到git stash
已在C中重新实现(而不是shell脚本)
参见Thomas Gummerer()的commit 7db9302(2019年3月11日)。
请参阅Johannes Schindelin()的提交1366c78,提交7b556aa(2019年3月7日)。(通过合并JUNIOÇ滨野- -在提交0ba1ba4,2019年4月22日)tgummerer
dscho
gitster
内置
stash
::(glob)
再次处理pathspecs在将路径规范列表传递给时
git add
,我们需要注意使用原始格式,而不是路径规范的解析形式。这有所作为,例如在打电话时
git stash -- ':(glob)**/*.txt'
原始形式包含
:(glob)
前缀,而解析形式不包含前缀。但是,在内置的中
git stash
,我们传递了已解析(即不正确)的表单,并且git add
会失败并显示错误消息:fatal: pathspec '**/*.txt' did not match any files
在
git stash
从工作树中删除更改的阶段,即使refs/stash
实际上已成功更新也是如此。
我使用一个别名,该别名接受一个字符串用作存储项的消息。
mystash = "!f() { git commit -m hold && git stash push -m \"$1\" && git reset HEAD^; }; f"
哪一个:
-u
或-a
),--soft
以将其保留在索引中)。