清理工作树中的未跟踪文件和文件夹,而不会丢失它们

11 浏览
0 Comments

清理工作树中的未跟踪文件和文件夹,而不会丢失它们

我对一个文件做了修改,还有一个新文件,想使用git stash将它们放到一边,然后切换到另一个任务。但是,仅使用git stash命令只能将对现有文件的修改暂存起来;新文件仍然存在于我的工作目录中,干扰我未来的工作。我该如何暂存这个未被跟踪的文件?

0
0 Comments

问题的出现原因是因为需要清理工作树中的未跟踪文件和文件夹,但又不想丢失它们。解决方法是使用git add命令将文件添加到索引中,然后使用git stash命令将索引中的内容和任何未暂存的更改都存储到存储区中。如果不想将已经在索引中的更改存储到存储区中,可以先提交索引,然后再使用git stash命令将新文件存储到存储区中,最后使用git revert命令恢复提交或者使用git checkout命令从提交中检出文件。另外,可以使用git add .命令将所有文件添加到索引中,如果该命令不起作用,可以使用--include-untracked选项来包括所有未跟踪的文件和文件夹。当应用存储的更改后,如果出现被提交的更改而不是被忽略的问题,可以使用git reset命令清除索引中的更改,但保留工作树中的更改。

0
0 Comments

在git 1.7.7版本之后,git stash命令接受--include-untracked选项(或简写的-u)。要在存储中包含未跟踪的文件,可以使用以下任一命令:

git stash --include-untracked
git stash -u

警告,如果.gitignore文件中有任何目录条目,这样做将永久删除您的文件。

很好 - 它终于按照手册中描述的方式工作了。不stash(和清理)新文件是错误的行为。

我的git版本是1.9.1,即使我在.gitignore中的内容看起来是这样的ignoredDirectory,并不是ignoredDirectory/*,它仍然会删除那些未跟踪的文件。甚至未跟踪的文件也不只是目录。

请解释一下警告。为什么会删除这些文件?它会删除它们而不是存储它们吗?我使用Git有一段时间了,还没有遇到这个问题。

这个警告也适用于*.extension条目吗?

-dubinsky,git 1.8.3的-u(--include-untracked)选项可以正确存储和弹出未跟踪的文件,但git stash show不会列出存储中的未跟踪文件。

是的,关于显示存储的未跟踪部分的讨论,请参见stackoverflow.com/a/12681856/239678

“不stash(和清理)新文件是错误的行为。” - 在这里,你是指如果我们不stash未跟踪的文件,那么会出现问题吗?提前感谢!

取决于您的项目,它们可能会出现问题。Git本身不会出现问题。

我喜欢git stash -u,因为它与git add -u相关,后者用于暂存除未跟踪文件之外的更改。

0
0 Comments

清理工作树中未跟踪的文件和文件夹,同时不丢失它们的解决方法是使用命令git stash --include-untracked。此命令将保存包括在.gitignore中的未跟踪文件。另外,可以使用-u的简写来代替--include-untracked,或者使用git stash --all(请注意下面的警告)来保存所有文件,包括未跟踪和已忽略的文件。这个行为在2018年发生了变化,所以请确保你的git已经更新到最新版本。

警告:似乎存在(或曾经存在)已忽略目录的内容可能会被永久删除的情况。点击此处查看更多信息。

为什么即使那些未被暂存的更改仍然存在,stash命令仍然会保存已更改的现有文件?

阅读kernel.org/pub/software/scm/git/docs/git-stash.html中的描述。这样做的目的是在进行stash操作后获得一个干净的工作树。

未暂存的新文件(即未跟踪的文件)不会被stash,它们将保留在工作目录中。

当你说“已更改的现有文件...尚未被暂存”时,我理解你指的是之前已经提交过的文件,然后被修改了,但尚未添加到暂存区中。如果你指的是未跟踪的文件,那么也许你的问题应该是“为什么不”而不是“为什么”。

我的意思是,除非新文件已经被暂存,否则它不会被stash,但是即使那些未暂存的现有文件也会被stash。对我来说,这似乎是不一致的。

现在,stash命令会在不需要暂存的情况下保存未跟踪的文件。

只需执行git stash pop即可恢复被删除的文件。

也可以使用git stash save -u "my save"

如上所述,是git stash save -u

我在Windows上运行git stash save -u,结果得到了一个无法访问的未跟踪文件夹,即使是管理员也无法删除...

我还发现git stash save -u --keep-index也很有用。

你的回答删除了我之前stash的所有已跟踪文件。

关于gitignore文件的警告,特别是如果你使用gitignore忽略了node_modules文件夹的Node应用程序开发,这将尝试stash整个node_modules文件夹,如果你有很多依赖项,这可能需要很长时间和空间。

建议先添加未跟踪的文件,然后再进行stash,这是一个很好的技巧。

这与git stash apply [1]是一个改变游戏规则的命令!更多关于apply命令的信息请参阅stackoverflow.com/questions/12147042

我认为在这个答案中将git stash --all放在最前面是一个错误,因为它可能会破坏包含在.gitignore中的文件。

作为你在这里有最好的答案,我建议在你的答案中将git stash --include-untracked放在git stash --all之前,有两个原因。首先,它更好地回答了2019年的问题,其次,因为--all会删除所有在.gitignore中的文件,这可能不是大多数用户想要的。

如果使用-u/--include-untracked添加未跟踪的文件,git stash showgit stash show --stat不会显示未跟踪文件的任何迹象。这对于混合跟踪和未跟踪的文件特别令人困惑,因为它使得看起来像是git已经无法恢复未跟踪的文件。这些文件在弹出或应用时会被恢复。

我必须写git stash save --include-untracked,即在“save”前面加上来使其工作。我使用的是git版本2.11.0。

git stash --all会修改node_modules文件夹。

我建议在使用git stash --all时加上更多的警告。大致内容如下:注意:使用git stash --all会stash所有在.gitignore中的文件,这可能会消耗大量的CPU资源,而且可能不是你想要的。常见的不想stash的已忽略文件包括:日志文件(可能非常大)、项目配置文件、像JS node_modules这样的库、像.DS_Store这样的操作系统文件等。这将使这个受欢迎的答案在快速查看时更有用。

已经在2.14.0版本中修复了在.gitignore中的directory/*条目文件被永久删除的问题。

不要使用git stash --all,几乎肯定不是你想要的。使用-u

除了使用别名之外,是否有一种方法来配置命令,使其始终stash未跟踪的文件而无需使用-u

使用消息:git stash push --include-untracked --message "Foo",感谢stackoverflow.com/a/58896840/1007074

0