我正在对代码库进行大量更改。有些变化已经上演,有些则没有。我需要切换到另一个分支,但还没准备好提交,所以我使用git stash
保存了当前状态。
后来,我去了git stash apply
申请我的藏匿处。然后我跑了git status
。我注意到我的分阶段更改不再显示为“已上演”,而是显示为“未提交更改的更改”#39;我的理解是正确的,没有数据实际丢失,而是“上演”#39;数据现在只需转换为“未分期”的数据。数据?
答案 0 :(得分:19)
问题的答案(“将存档转换为已暂存的文件”)既是肯定也是否。
如果您申请了git stash apply
(vs git stash pop
),那么您的状态仍然很好,因为存储仍然存在。但是让我们稍微回顾一下,看一下潜在的机制,因为这里很重要。
当您运行git stash save
(或执行git stash
的普通save
)时,git会发出两个不在任何分支上的 1 提交。一个提交保存索引的状态,即你上演的任何内容。第二个提交保存工作树的状态,即其他所有内容。
稍后,当您使用git stash apply
时,git会一起刷新更改,以便不会播放任何内容,除非您将--index
2 添加到apply
操作,在这种情况下,它会恢复(如果可以)您之前的分阶段与未分阶段的安排。
当您使用apply
时,存储脚本也会保留存储提交,因此如果应用不按照您想要的方式进行 - 包括您忘记--index
或拼写错误(请参阅脚注) 2) - 您可以git reset --hard
(假设您在开始时一切都处于干净状态)并重新执行apply
。
如果您已经使用过pop
,并且git认为应用程序有效,则会丢弃存储。出于这个原因,我通常建议单独使用apply和drop。
1 使用-u
或-a
,不仅可以保存暂存和未暂存的文件,还可以忽略和/或所有文件,隐藏脚本会使三< / em>提交。但是,如果没有这些标志,这些文件就不会进入存储的任何一部分。
2 令人困惑的是,存储脚本还有一个--keep-index
标志,它允许您指定apply
操作,但没有任何意义。相反,--keep-index
会影响stash
在进行特殊存储提交后所执行的操作。偶尔我偶然完成了git stash apply --keep-index
而不是git stash apply --index
,混淆了两个选项。
答案 1 :(得分:3)
不,没有任何变化。
度Acc。到documentation:
Git会重新修改您保存存储时未提交的文件。在这种情况下,当您尝试应用存储时,您有一个干净的工作目录,并且您尝试将其应用于您保存它的同一分支;但是有一个干净的工作目录并在同一个分支上应用它不是成功应用存储的必要条件。您可以在一个分支上保存存储,稍后切换到另一个分支,并尝试重新应用更改。当您应用存储时,您还可以在工作目录中拥有已修改和未提交的文件 - 如果任何内容不再适用,Git会为您提供合并冲突。
重新应用了对文件的更改,但是您上传的文件 之前没有重新开始。为此,您必须运行git stash apply 带有--index选项的命令告诉命令尝试重新应用 阶段性的变化。如果你已经改变了,那你就得到了 回到原来的位置:
$ git stash apply --index # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: index.html # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # # modified: lib/simplegit.rb #
答案 2 :(得分:2)
是的,你的想法是正确的。它在man git-stash
的以下部分中进行了描述:
Use git stash when you want to record the current state of the working
directory and the index, but want to go back to a clean working
directory. The command saves your local modifications away and reverts
the working directory to match the HEAD commit.
(...)
pop [--index] [-q|--quiet] [<stash>] Remove a single stashed
state from the stash list and apply it on top of the
current working tree state, i.e., do the inverse operation
of git stash save. The working directory must match the
index.
(...)
If the --index option is used, then tries to reinstate not
only the working tree’s changes, but also the index’s
ones.
(...)
apply [--index] [-q|--quiet] [<stash>]
Like pop, but do not remove the state from the stash list.