我想做以下工作流程:
有没有办法做第2步?
例
echo "123" > foo
git add foo # Assumes this is a git directory
echo "456" >> foo
git stash
cat foo # Should yield 123
git stash save
有一个选项--keep-index
,它完全符合你的需要。
所以,运行git stash save --keep-index
。
git stash save --keep-index
另外,Re:
为什么不在升级后提交更改? - 申
答:因为你应该经常签入经过测试的代码:)这意味着,你需要只用你要提交的更改来运行测试
所有这一切除了当然,作为一名经验丰富的程序员,你有天生的冲动来测试和审查这些变化 - 只是部分开玩笑
这可以通过3个步骤完成:保存分阶段更改,存储其他所有内容,使用分阶段更改恢复索引。基本上是:
git commit -m 'Save index'
git stash push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^
这将完全符合您的要求。
使用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 save
为修复做出改变;和测试;提交他们:
$ git add [--interactive] [--patch]
$ git commit -m“fix ...”
现在恢复以前上演的更改:
$ git stash pop
解决任何冲突,并注意如果有冲突,git将应用但不删除顶部存储条目。
(...然后提交暂存的更改,并恢复所有其他更改的存储,并继续...)
另一个提示,与问题有关:
使用时有效地存储未分级的更改
$ git stash save --keep-index
你可能希望给藏匿处一个消息,这样当你做一个git stash list
时,你之前隐藏的东西就更明显了,特别是如果你通过进一步的保存来遵循那个藏匿操作。例如
$ git stash save --keep-index“尚未上演的更改”
(尽管实际上它确实包含了其他答案中提到的所有变化)。
例如,以上可能紧接着:
$ git stash save“功能X的分阶段更改”
但要注意,你不能使用它
$ git stash apply“stash @ {1}”###✘并不是你想要的
仅恢复未分级的更改。
要将未标记(未添加到提交)文件添加到存储,请运行以下命令:
git stash -k
然后你可以提交暂存的文件。之后,您可以使用以下命令取回最后一个存储的文件:
git stash pop
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可能更容易。
这个命令的现代形式是git stash push [--] [<pathspec>...]
,因为Git 2.16+(git stash save
is deprecated)
您可以将其与通配符表单组合,例如:
git stash push --all --keep-index ':(glob)**/*.testextension'
但这对于Git for Windows来说效果不佳,直到Git 2.22(2019年第二季度),请参阅issue 2037,考虑git stash
has been re-implemented in C(而不是shell脚本)
参见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)
pathspecs当将一个路径规范列表传递给
git add
时,我们需要小心使用原始形式,而不是路径规范的解析形式。这有所不同,例如在打电话时
git stash -- ':(glob)**/*.txt'
原始表单包含
:(glob)
前缀,而解析后的表单不包含git stash
前缀。但是,在内置的
git add
中,我们传递了解析(即不正确)的形式,并且fatal: pathspec '**/*.txt' did not match any files
将失败并显示错误消息:git stash
在
refs/stash
从工作树中删除更改的阶段,即使qazxswpoi已成功更新。