git stash-u将未跟踪的文件保留在工作目录中

git stash-u将未跟踪的文件保留在工作目录中,git,git-stash,Git,Git Stash,如果我理解正确,git stash-u将所有内容都隐藏在工作目录中,包括未跟踪的文件,并将工作目录置于上次提交后的状态,即HEAD位置 但当我运行它时,它除去了除一个文件夹以外的所有未跟踪文件(当然也从我的工作目录中删除了所有跟踪和修改的文件)。在存放之前或之后,该特定文件夹不在my.gitignore中。在我运行命令之前和之后,它显示为未跟踪。这是一个bug还是发生这种情况的原因 为了进一步了解细节,我在同一份回购协议中从其他地方复制了该文件夹,但我对其他几个被隐藏和删除的文件夹也做了同样的操

如果我理解正确,
git stash-u
将所有内容都隐藏在工作目录中,包括未跟踪的文件,并将工作目录置于上次提交后的状态,即HEAD位置

但当我运行它时,它除去了除一个文件夹以外的所有未跟踪文件(当然也从我的工作目录中删除了所有跟踪和修改的文件)。在存放之前或之后,该特定文件夹不在my
.gitignore
中。在我运行命令之前和之后,它显示为未跟踪。这是一个bug还是发生这种情况的原因

为了进一步了解细节,我在同一份回购协议中从其他地方复制了该文件夹,但我对其他几个被隐藏和删除的文件夹也做了同样的操作。我的目标是将所有已跟踪和未跟踪的本地更改都隐藏起来,这样我就可以获得与最新提交状态完全相同的工作目录。

TL;博士 但当我运行它时,它除去了除一个文件夹以外的所有未跟踪文件(当然也从我的工作目录中删除了所有跟踪和修改的文件)。在隐藏之前或之后,该特定文件夹不在my.gitignore中。在我运行命令之前和之后,它显示为未跟踪。这是一个bug还是发生这种情况的原因

这取决于此文件夹中的内容。Git一开始从不存储文件夹,所以如果文件夹是空的,这就是它会保留的原因之一;但是Git也从不费心在
Git状态中提到空文件夹,所以你可能指的是一个非空文件夹

整个事情有点神秘。也许你能解决它

长的 我认为,从没有
-u
-a
选项(这两个选项都有较长的拼写:
--分别包括未跟踪的
--全部
)的情况下使用
git stash
开始是有帮助的。这种
git隐藏的功能是:

  • 提交Git索引中的任何内容:这与
    Git提交
    所做的提交相同,只是
    Git stash
    不在任何分支上而不是在当前分支上进行此提交;然后
  • 提交Git索引中的任何文件,在所有文件上使用
    Git add
    后,即相当于
    Git add-u&&Git commit
    :这与仅执行此操作时得到的提交类似,只是
    Git stash
    也会在无分支上而不是在当前分支上进行此提交,由于内部原因,使Git的其余部分将此提交视为合并提交。1然后,
    Git stash
    will
  • 运行
    git reset--hard
    ,重置git的索引和工作树
  • 最后一次的
    git重置--hard
    将擦除所有暂存更改和所有未暂存更改。2这是可以做到的,因为恢复这些更改(暂存和/或未暂存)所需的一切都在步骤1和2中所做的
    git stash
    提交中

    要真正理解这一点,尽管您需要很好地理解Git的索引是关于什么的,所以第1点和第2点是有意义的。让我们花一点时间来定义这一点,因为太多的Git教程不好。(如果您已经确切地知道索引是什么,并为您做了什么,请跳过下一节。)



    1如果Git所有人都认为此提交是合并提交,那么它可能是合并提交。但它不是使用Git的任何合并机制制作的。那么这是合并提交还是不合并提交?这有关系吗?如果是,什么时候重要?这些都是值得思考的有用问题,但只有在您对Git的其他部分有了丰富的经验之后。您是否仍然需要更改后的文件,以便以后将其放入
    存储库中?然后,您的目标是,您的工作目录看起来与上次提交的目录相同。因此,如果自上次提交以来不需要更改的文件,请运行
    git clean-fd
    f
    用于文件和
    d
    目录)。注意:这些变化永远不会发生!我以后可能需要这些文件,这就是为什么我决定使用
    git stash-u
    。同时我不认为他们处于我可以做出承诺的状态。我的困惑主要是为什么
    git stash-u
    在我的工作树中留下了一个未跟踪的文件夹?如果没有进一步的信息,很难提供帮助。您说未隐藏的文件夹不在此存储库中的任何
    .gitignore
    中。您是否尝试过以下命令:
    git stash-u--all
    也将所有更改的文件都隐藏在
    .gitignore
    中?也许
    .gitignore
    中的文件夹最终会被忽略。感谢您的全面回答。作为git的初学者,我学到了一些以前不知道的东西。文件夹中没有git存储库。我看不出它有什么不同于其他的原因。编辑:我运行了
    git ls tree stash ^3
    ,该文件夹中的文件似乎在stash commit中(我之前在错误的目录中运行过它)。这意味着它在做它的工作,对吗?那么为什么git reset--hard
    部分不起作用呢?请注意,
    git reset--hard
    本身不会触及任何未跟踪的文件。(不在[main]索引中意味着与它们无关。)谜团在于,为什么在将这些文件放入额外的
    u
    commit之后,本应从工作树中删除这些相同文件的步骤未能删除至少一个这样的文件。(这假设您已经仔细地将
    git ls tree-r stash ^3
    输出与延迟的未跟踪文件进行了比较,并发现在该提交中存在延迟的未跟踪文件。否则,谜团就是为什么它们不在
    u
    提交中。)