我想使用这个工作流:
进行一些改变。 将未分阶段的更改保存到存储中。 用阶段中的东西做一些事情(构建、测试等)。 提交。 恢复未分阶段的更改。
有办法完成第二步吗?
例子:
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
当前回答
To my knowledge, it is currently impossible to save only unstaged changes in the working tree with git stash push, i.e. to save changes from the index state. This command saves all changes in the working tree (staged and unstaged changes), i.e. changes from the HEAD state, even with the option --keep-index which also sets the working tree state to the index state instead of the HEAD state (thereby creating conflicts when restoring the changes from the HEAD state with git stash pop). It would be very convenient if git stash push had an option -U|--unstaged for saving only unstaged changes (to me the option --keep-index is flawed), since it has already an option -S|--staged for saving only staged changes.
所以现在你必须模仿
git stash push --unstaged
git stash pop
使用临时文件:
git diff >unstaged
git restore .
git apply unstaged
rm unstaged
您的用例是在提交部分更改之前进行测试,它已经在参考文档中,但是使用了有缺陷的选项——keep-index,这会产生冲突。下面是带有模拟选项-U|——unstaging的版本:
git init
echo one >file
git add file
git commit
echo two >>file
git add file
echo three >>file
git diff >unstaged
git restore .
test
git commit
git apply unstaged
rm unstaged
想象状态
为了更好地理解存储,我认为在每一步查看工作树、索引和HEAD的状态是很重要的。让我们看看你的用例。
git init
working | index | HEAD |
---|
回显一个>文件
working | index | HEAD |
---|---|---|
one |
Git添加文件
working | index | HEAD |
---|---|---|
one | one |
git提交
working | index | HEAD |
---|---|---|
one | one | one |
回显两个>>文件
working | index | HEAD |
---|---|---|
one | one | one |
two |
Git添加文件
working | index | HEAD |
---|---|---|
one | one | one |
two | two |
回三>>文件
working | index | HEAD |
---|---|---|
one | one | one |
two | two | |
three |
愉快
去恢复.
working | index | HEAD |
---|---|---|
one | one | one |
two | two |
test
git提交
working | index | HEAD |
---|---|---|
one | one | one |
two | two | two |
Git应用unstaging
罗unstaged
working | index | HEAD |
---|---|---|
one | one | one |
two | two | two |
three |
其他回答
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.
这可以通过3个步骤完成:保存阶段性更改,保存所有其他内容,使用阶段性更改恢复索引。基本上就是:
git commit -m 'Save index'
git stash push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^
这正是你想要的。
我对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
To my knowledge, it is currently impossible to save only unstaged changes in the working tree with git stash push, i.e. to save changes from the index state. This command saves all changes in the working tree (staged and unstaged changes), i.e. changes from the HEAD state, even with the option --keep-index which also sets the working tree state to the index state instead of the HEAD state (thereby creating conflicts when restoring the changes from the HEAD state with git stash pop). It would be very convenient if git stash push had an option -U|--unstaged for saving only unstaged changes (to me the option --keep-index is flawed), since it has already an option -S|--staged for saving only staged changes.
所以现在你必须模仿
git stash push --unstaged
git stash pop
使用临时文件:
git diff >unstaged
git restore .
git apply unstaged
rm unstaged
您的用例是在提交部分更改之前进行测试,它已经在参考文档中,但是使用了有缺陷的选项——keep-index,这会产生冲突。下面是带有模拟选项-U|——unstaging的版本:
git init
echo one >file
git add file
git commit
echo two >>file
git add file
echo three >>file
git diff >unstaged
git restore .
test
git commit
git apply unstaged
rm unstaged
想象状态
为了更好地理解存储,我认为在每一步查看工作树、索引和HEAD的状态是很重要的。让我们看看你的用例。
git init
working | index | HEAD |
---|
回显一个>文件
working | index | HEAD |
---|---|---|
one |
Git添加文件
working | index | HEAD |
---|---|---|
one | one |
git提交
working | index | HEAD |
---|---|---|
one | one | one |
回显两个>>文件
working | index | HEAD |
---|---|---|
one | one | one |
two |
Git添加文件
working | index | HEAD |
---|---|---|
one | one | one |
two | two |
回三>>文件
working | index | HEAD |
---|---|---|
one | one | one |
two | two | |
three |
愉快
去恢复.
working | index | HEAD |
---|---|---|
one | one | one |
two | two |
test
git提交
working | index | HEAD |
---|---|---|
one | one | one |
two | two | two |
Git应用unstaging
罗unstaged
working | index | HEAD |
---|---|---|
one | one | one |
two | two | two |
three |
在git 2.7.4版本中,你可以:
git stash save --patch
git会问你是否添加你的更改到stash。 然后你只需回答y或n
你可以恢复工作目录,你总是这样做:
git stash pop
或者,如果你想在stash保存更改:
git stash apply