应用git stash - 新添加的文件不包括在内?

时间:2014-07-31 12:31:30

标签: git git-stash

如果您有多个新添加到存储库但未提交的文件,然后执行git stashgit pullgit stash apply stash@{0},则新增的原因是什么添加的文件不包含在申请中?

昨天,当同事修改了htaccesshtpasswd文件并在暂存环境中创建了备份时发生了这种情况。这些备份文件未添加到存储库中,导致致命错误并导致git pull中止。所以我通过git add <filename>添加了文件,然后执行了一个stash,pull和apply,只是发现新的htaccess和htpasswd文件没有包含在apply中。

但是,git stash show -p stash@{0} | grep "diff"显示文件名在存储中,我可以通过省略grep管道来查看内容。此解决方案是通过git checkout stash@{0} -- <filename>解决的,但问题仍然是为什么存储应用不包含这些文件。

2 个答案:

答案 0 :(得分:1)

事实是,在制作一些git命令时不会考虑未跟踪的文件。这样更安全,因为忽略它们是默认情况下我们可以做出的最安全的选择(自动添加真的你想要的东西,相信我)。

因此,如果您想将新添加的文件包含在您的存储空间中,只需git add它们并跟踪它们。

修改

抱歉,我对新添加的文件和跟踪的新文件感到困惑。

根据git stash

的联机帮助页
  

如果使用 --keep-index 选项,则已添加到索引中的所有更改都将保持不变。

     

如果使用 --include-untracked 选项,则所有未跟踪的文件也会被隐藏,然后使用git clean进行清理,使工作目录处于非常干净的状态。如果使用--all选项,则除了未跟踪的文件外,还会隐藏和清除被忽略的文件。

     

使用 --patch ,您可以交互式地从HEAD和要隐藏的工作树之间的差异中选择帅哥。构建存储条目,使其索引状态与存储库的索引状态相同,并且其工作树仅包含您以交互方式选择的更改。然后,从您的工作树中回滚所选更改。请参阅git-add(1)的“互动模式”部分,了解如何操作 --patch 模式。

     

--patch 选项意味着 --keep-index 。您可以使用 --no-keep-index 来覆盖此内容。

然后,稍后会给你一个例子:

  

测试部分提交

     

如果要在工作树中进行两次或更多次提交,并且希望在提交之前测试每次更改,则可以使用git stash save --keep-index :< / p>

   # ... hack hack hack ...
   $ git add --patch foo            # add just first part to the index
   $ git stash save --keep-index    # save all other changes to the stash
   $ edit/build/test first part
   $ git commit -m 'First part'     # commit fully tested change
   $ git stash pop                  # prepare to work on all other changes
   # ... repeat above five steps until one commit remains ...
   $ edit/build/test remaining parts
   $ git commit foo -m 'Remaining parts'

因此,为了将当前分支中的所有更改都包含在存储中,您应该使用--keep-index选项,或者通过标记它们来仔细选择要包含的文件

时添加--patch选项。

答案 1 :(得分:1)

stash分别存储索引和工作树状态(作为两次或三次提交"stash-bag"挂起提交,HEAD在您提交时指向该提交。

git stash show命令将HEAD提交(stash^)与工作树提交(stash)进行比较,忽略索引提交(stash^2)以及任何未跟踪/忽略/全文件提交(stash^3)。

如果您的git stash show显示它们,则它们必须在工作树提交中。因此,通常应该还原它们,或者如果文件现在存在,则合并可能会失败。请参阅this answer,了解git stash apply所采取的步骤列表。

我无法重现您的特定问题,但在创建存储(-a-u)和/或应用(--index或不是)时使用哪些标记可能很重要,以及您可能拥有的任何git rerere分辨率。您还可以使用git ls-treegit show来检查仍然在最多三个特殊存储提交中的文件(stashstash^2stash^3 case,因为它全部是stash@{0}),并将它们与你当前的工作树(尤其是apply之前的工作树进行比较,如果你可以重建它)。