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

问题描述 投票:164回答:9

我想做以下工作流程:

  1. 向舞台添加更改。
  2. 存储所有未上传的其他更改。
  3. 在阶段做一些事情(即构建,运行测试等)
  4. 应用藏匿处。

有没有办法做第2步?

 echo "123" > foo
 git add foo # Assumes this is a git directory
 echo "456" >> foo
 git stash
 cat foo # Should yield 123
git git-stash
9个回答
242
投票

git stash save有一个选项--keep-index,它完全符合你的需要。

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


27
投票
git stash save --keep-index

另外,Re:

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

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

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


26
投票

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

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

这将完全符合您的要求。


11
投票

使用git version 2.7.4,您可以:

git stash save --patch

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

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

git stash pop

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

git stash apply

5
投票

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

首先存放一切,但保持分阶段的变化完好无损

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

现在也分别存储分阶段的更改

$ git stash save

为修复做出改变;和测试;提交他们:

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

$ git commit -m“fix ...”

现在恢复以前上演的更改:

$ git stash pop

解决任何冲突,并注意如果有冲突,git将应用但不删除顶部存储条目。

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


2
投票

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

使用时有效地存储未分级的更改

$ git stash save --keep-index

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

$ git stash save --keep-index“尚未上演的更改”

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

例如,以上可能紧接着:

$ git stash save“功能X的分阶段更改”

但要注意,你不能使用它

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

仅恢复未分级的更改。


1
投票

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

git stash -k

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

git stash pop

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可能更容易。


0
投票

这个命令的现代形式是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 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) 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已成功更新。

© www.soinside.com 2019 - 2024. All rights reserved.