Git stash with staged files。存储是否将暂存的文件转换为未暂存?

时间:2015-07-23 18:56:43

标签: git git-stash

我正在对代码库进行大量更改。有些变化已经上演,有些则没有。我需要切换到另一个分支,但还没准备好提交,所以我使用git stash保存了当前状态。

后来,我去了git stash apply申请我的藏匿处。然后我跑了git status。我注意到我的分阶段更改不再显示为“已上演”,而是显示为“未提交更改的更改”#39;我的理解是正确的,没有数据实际丢失,而是“上演”#39;数据现在只需转换为“未分期”的数据。数据?

编辑:我应该补充一点,有些文件有暂存版本,以及存储时的非暂存版本。例如,文件A进行了一些更改,这些更改已暂存。然后,对文件A进行了一些更改,这些文件尚未上演。然后,藏了起来。

3 个答案:

答案 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.