我想使用这个工作流:
进行一些改变。 将未分阶段的更改保存到存储中。 用阶段中的东西做一些事情(构建、测试等)。 提交。 恢复未分阶段的更改。
有办法完成第二步吗?
例子:
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没有只存储未分阶段更改的命令。
但是,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的答案可能更简单。
其他回答
我使用了一个别名,它接受一个字符串作为消息发送到存储条目。
mystash = "!f() { git commit -m hold && git stash push -m \"$1\" && git reset HEAD^; }; f"
哪一个:
提交索引中的所有内容, 将更改的内容存储在工作树中(当然可以添加-u或-a), 将最后一次提交重置回工作尝试(可能需要使用——soft将其保留在索引中)。
这可以通过3个步骤完成:保存阶段性更改,保存所有其他内容,使用阶段性更改恢复索引。基本上就是:
git commit -m 'Save index'
git stash push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^
这正是你想要的。
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 stash push有一个选项——keep-index,这正是你所需要的。
运行git stash push——keep-index。
使用实例添加未分期(未添加到提交)的文件到stash。
git stash -k
如果你想要将新添加的文件(不是阶段性的-不是绿色的)也包含到stash中,请执行以下操作:
git stash -k -u
然后可以提交暂存文件。在此之后,您可以使用命令返回最后存储的文件:
git stash pop