如果您有多个新添加到存储库但未提交的文件,然后执行git stash
,git pull
和git stash apply stash@{0}
,则新增的原因是什么添加的文件不包含在申请中?
昨天,当同事修改了htaccess
和htpasswd
文件并在暂存环境中创建了备份时发生了这种情况。这些备份文件未添加到存储库中,导致致命错误并导致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>
解决的,但问题仍然是为什么存储应用不包含这些文件。
答案 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-tree
和git show
来检查仍然在最多三个特殊存储提交中的文件(stash
,stash^2
和stash^3
case,因为它全部是stash@{0}
),并将它们与你当前的工作树(尤其是apply
之前的工作树进行比较,如果你可以重建它)。