我想使用这个工作流:
进行一些改变。 将未分阶段的更改保存到存储中。 用阶段中的东西做一些事情(构建、测试等)。 提交。 恢复未分阶段的更改。
有办法完成第二步吗?
例子:
git init
echo one >file
git add file
git commit
echo two >>file
git add file
echo three >>file
git stash push
test
git commit
git stash pop
我想使用这个工作流:
进行一些改变。 将未分阶段的更改保存到存储中。 用阶段中的东西做一些事情(构建、测试等)。 提交。 恢复未分阶段的更改。
有办法完成第二步吗?
例子:
git init
echo one >file
git add file
git commit
echo two >>file
git add file
echo three >>file
git stash push
test
git commit
git stash pop
当前回答
从Git 2.35+ (Q1 2022)开始,你现在可以在Git stash推送上使用——staging标志(man)来只stage你的索引的变化。
既然你的问题正好相反,我们有两个选择:
像这样反向操作:
git stash push --staged # Stash staged changes
git stash # Stash everything else
git stash pop stash@{1} # Restore staged changes stash
阶段性的更改是你想要保存的,而不是你想要保留的。现在你可以运行:
git stash push --staged
我从另一个S/O帖子的回答中得到了这个信息。
其他回答
扩展前面的回答,我有时会有一组复杂的更改,但希望先提交一个单独的更改。例如,我可能发现了一个错误或其他不正确的代码,我想在进行阶段性更改之前修复它。一个可行的方法是:
首先把所有东西都藏起来,但保留阶段性的变化
$ git保存——keep-index[——include-untracked]
现在也将阶段性更改单独保存
$ git保存
为解决问题做出改变;和测试;提交:
$ git add[——interactive][——patch] $ git commit -m"fix…"
现在恢复之前的更改:
$ git隐藏pop
解决任何冲突,并注意如果存在冲突,git将应用而不是删除顶部的隐藏条目。
(…然后提交分阶段的更改,并恢复所有其他更改的存储,然后继续…)
从Git 2.35+ (Q1 2022)开始,你现在可以在Git stash推送上使用——staging标志(man)来只stage你的索引的变化。
既然你的问题正好相反,我们有两个选择:
像这样反向操作:
git stash push --staged # Stash staged changes
git stash # Stash everything else
git stash pop stash@{1} # Restore staged changes stash
阶段性的更改是你想要保存的,而不是你想要保留的。现在你可以运行:
git stash push --staged
我从另一个S/O帖子的回答中得到了这个信息。
git stash save --keep-index
此外,Re:
为什么不在提交更改之后提交它们呢?——心
答:因为你应该总是签入测试过的代码:)这意味着,你只需要用你即将提交的更改来运行测试
当然,作为一名有经验的程序员,您天生就有测试和检查这些更改的冲动——这只是在开玩笑
在git 2.7.4版本中,你可以:
git stash save --patch
git会问你是否添加你的更改到stash。 然后你只需回答y或n
你可以恢复工作目录,你总是这样做:
git stash pop
或者,如果你想在stash保存更改:
git stash apply
2022:我在“在git中只存储阶段性变化-这可能吗?”中提到,git 2.35(第一季度2022)附带了“git隐藏推送-阶段性”(男人):
此选项仅对推送和保存命令有效。 只保存当前暂存的更改。 这类似于基本的git提交,除了状态提交到stash而不是当前分支。
2019:该命令的现代形式是git stash push[——][<pathspec>…]],因为Git 2.16+ (Git保存已弃用)
你可以将其与通配符表单结合起来,例如:
git stash push --all --keep-index ':(glob)**/*.testextension'
但这并不适用于Git for Windows,直到Git 2.22(2019年第二季度),见issue 2037,考虑到Git stash已在C中重新实现(而不是shell脚本)。
参见Thomas Gummerer (tummerer)的commit 7db9302(2019年3月11日)。 参见Johannes Schindelin (dscho)的commit 1366c78, commit 7b556aa(2019年3月07日)。 (由Junio C Hamano - gitster -在commit 0ba1ba4中合并,2019年4月22日)
built-in stash: handle :(glob) pathspecs again When passing a list of pathspecs to, say, git add, we need to be careful to use the original form, not the parsed form of the pathspecs. This makes a difference e.g. when calling git stash -- ':(glob)**/*.txt' where the original form includes the :(glob) prefix while the parsed form does not. However, in the built-in git stash, we passed the parsed (i.e. incorrect) form, and git add would fail with the error message: fatal: pathspec '**/*.txt' did not match any files at the stage where git stash drops the changes from the worktree, even if refs/stash has been actually updated successfully.