我想使用这个工作流:
进行一些改变。 将未分阶段的更改保存到存储中。 用阶段中的东西做一些事情(构建、测试等)。 提交。 恢复未分阶段的更改。
有办法完成第二步吗?
例子:
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
当前回答
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.
其他回答
在git 2.7.4版本中,你可以:
git stash save --patch
git会问你是否添加你的更改到stash。 然后你只需回答y或n
你可以恢复工作目录,你总是这样做:
git stash pop
或者,如果你想在stash保存更改:
git stash apply
这可以通过3个步骤完成:保存阶段性更改,保存所有其他内容,使用阶段性更改恢复索引。基本上就是:
git commit -m 'Save index'
git stash push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^
这正是你想要的。
重新思考:没有必要只将存储数据限制在工作树更改上,但是可以稍后在应用时决定只应用存储的工作树更改。
因此,在储存时间,只要像往常一样做:
git stash [-k|--keep-index]
在申请的时候
git cherry-pick -m2 -n stash
解释:-m2选择对阶段提交的第二个父元素的更改,即存储的索引状态。-n|——no-commit阻止自动提交。stash@{1}将是堆栈中第二个stash的ref…
我对Python程序如何预提交感兴趣。这是代码。 https://github.com/pre-commit/pre-commit/blob/3fe38dff05957f609cf7b97f471b35a8d9e0659a/pre_commit/staged_files_only.py#L50
它在功能上等同于:
git diff-index --ignore-submodules --binary --exit-code --no-color --no-ext-diff $(git write-tree) -- >stash.patch
git checkout -- .
# Do stuff now
git apply stash.patch && rm stash.patch
另一个建议,与这个问题有关:
当您使用
$ git stash save -keep-index
你可能希望给stash一个消息,这样当你做一个git隐藏列表时,它会更明显地显示你之前隐藏了什么,特别是当你跟随stash操作进一步保存时。例如
$ git保存保存—keep-index“尚未进行更改”
(尽管实际上它确实包含了其他答案中提到的所有变化)。
例如,上面的语句之后可以立即加上:
$ git保存“功能X的阶段性变化”
但是要注意,你不能使用它
$ git stash apply "stash@{1}" ###所以并不完全符合你的要求
只恢复未分阶段的变化。