首页 > 解决方案 > 执行“git stash push -all”后如何从存储条目中恢复文件?

问题描述

我进行了本地更改,其中包括一些新文件和一些文件更改。我的目标是存储新文件和更改,然后更新主分支,最后恢复所有更改以提交它们。

为此,我认为我可以使用“git stash push -all”。这样做并更新主分支后,我想恢复文件/文件更改。因此,我继续使用“git stash pop”,这导致两个未跟踪的文件被恢复,但到目前为止还不是全部。究竟出了什么问题?

我了解到“-all”意味着即使是未跟踪的文件也会被隐藏。我认为这意味着通常应该被 git 忽略的文件(gitignore 文件)现在也在存储中,对吗?

在使混乱变得更糟之前,我怎样才能正确恢复一切?我是 git 新手。

提前致谢

标签: git

解决方案


正如您所发现的,--all标志(注意这里的两个破折号)表示所有文件,包括未跟踪和忽略的文件。该标志也可以拼写-a(一个破折号,单独拼写a)。1 有一个不同的标志,--include-untracked-u,表示所有文件,包括未跟踪的文件,但不包括未跟踪和忽略的文件。2

了解其git stash工作原理很重要。这比我上次描述的时候变得更漂亮了,因为git stash现在可以根据路径规范构建受限的存储。尽管如此,如何从“git stash save --all”中恢复还是值得一读的 存储代码仍然使用我在那里描述的二或三提交机制,并且仍然运行等效于git resetand git clean:只是如果您确实提供了路径规范,则所做的提交以及重置和/或清理的文件受到限制.

在您的特定情况下,中断git stash push 可能会给您留下几个存储区和一个部分清理的存储库。随后的额外存储将保存部分清理状态。从 shell 代码重写为 C 代码使得这种零散的行为不太可能发生,但您可能使用的 Git 版本仍然使用 shell 脚本来实现git stash.

恢复将是找到所有提交的问题,并使用它们来取回文件。


1与大多数 POSIX(Unix 风格)命令一样,“long”选项all前面有两个破折号,“short”(单字母)选项前面有一个破折号(因此git diff -cvs git diff --cc:longcc选项需要两个破折号;-cc指定空头c选项两次,无效)。

2根据 Git 自己的定义,所有被忽略的文件也是未跟踪的文件,但并非所有未跟踪的文件都被忽略。这是因为忽略文件的定义是存在于您的工作树中的文件,但在 Git 的 index 中不存在跟踪文件的定义是存在于 Git 索引中的文件。如果文件存在于 Git 的索引中,它会被跟踪,因此不会被忽略。如果它未被跟踪,它就不会出现在 Git 的索引中。然后它可以被忽略,但不一定被忽略。


推荐阅读