你如何隐藏一个未跟踪的文件?

我对文件的更改以及一个新文件,并且想在切换到另一个任务时使用git stash将它们放在一边。但是git stash本身仅隐藏对现有文件的更改;新文件保留在我的工作树中,扰乱了我未来的工作。如何隐藏这个未跟踪的文件?

839515 次浏览

将文件添加到索引中:

git add path/to/untracked-filegit stash

索引的全部内容,加上对现有文件的任何未暂存更改,都将进入存储。

要存储您的工作目录,包括未跟踪的文件(尤其是那些在.gitignore中的文件),那么您可能需要使用此cmd:

git stash --include-untracked

或者,您可以使用简写-u而不是--include-untracked,或者简单地使用git stash --all来隐藏所有文件,包括未跟踪忽略文件。这种行为在2018年发生了变化,因此请确保您的git是最新的。


警告:似乎存在(或曾经存在)被忽略目录的内容可能被永久删除的情况。请参阅此存档网站以获取更多信息

我认为这可以通过告诉git文件存在来解决,而不是将其所有内容提交到暂存区域,然后调用git stash。Araqnid描述如何执行前者。

git add --intent-to-add path/to/untracked-file

git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file

但是,后者不起作用:

$ git stashb.rb: not added yetfatal: git-write-tree: error building treesCannot save the current index state

正如在其他地方所说,答案是git add文件。例如:

git add path/to/untracked-filegit stash

然而,另一个答案也提出了这个问题:如果你真的不想添加文件怎么办?好吧,据我所知,你必须这样做。以下将不是工作:

git add -N path/to/untracked/file     # note: -N is short for --intent-to-addgit stash

这将失败,如下所示:

path/to/untracked-file: not added yetfatal: git-write-tree: error building treesCannot save the current index state

那么,你能做什么?好吧,你必须真正添加文件,然而,你可以稍后有效地取消添加它,使用git rm --cached

git add path/to/untracked-filegit stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder# do some other workgit stash list# shows:# stash@{0}: On master: don't forget to un-add path/to/untracked-filegit stash pop   # or apply instead of pop, to keep the stash availablegit rm --cached path/to/untracked-file

然后您可以继续工作,与git add之前的状态相同(即使用名为path/to/untracked-file的未跟踪文件;加上您可能不得不跟踪文件的任何其他更改)。

关于这个工作流程的另一种可能性是:

git ls-files -o > files-to-untrackgit add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!git stash# do some workgit stash popgit rm --cached `cat files-to-untrack`rm files-to-untrack

[注意:正如@mancocapac的评论中提到的,您可能希望将--exclude-standard添加到git ls-files命令(因此,git ls-files -o --exclude-standard)。]

…这也可以很容易地编写脚本-甚至别名也可以(以zsh语法呈现;根据需要进行调整)[此外,我缩短了文件名,因此它都适合屏幕而无需滚动此答案;随意替换您选择的备用文件名]:

alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'

请注意,后者作为外壳脚本或函数可能更好,以允许将参数提供给git stash,以防您不想要pop而是apply,和/或希望能够指定特定的存储,而不仅仅是获取顶部。也许这(而不是上面的第二个别名)[空白剥离以适合而不滚动;重新添加以增加易读性]:

function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}

注释:在这种形式中,如果您要提供存储标识符,则需要提供操作参数以及标识符,例如unstashall apply stash@{1}unstashall pop stash@{1}

当然,你会把它放在你的.zshrc或等价物中,让它长期存在。

希望这个答案对某人有帮助,把所有的东西都放在一个答案中。

我曾经思考和渴望同样的功能。但随着时间的推移,我注意到它真的不需要。当您隐藏时,可以保留新文件。它们不会发生任何“坏”事情(当您签出其他内容时,git会出错并且不会覆盖现有的未跟踪文件)

由于通常git stashgit stash pop之间的时间范围相当小,因此您将再次快速需要未跟踪的文件。所以我想说文件显示在git status的不便,而你正在做其他事情(在git stashgit stash pop之间)是较小的不便造成的工作和需要注意,否则成本将尝试添加未跟踪的文件到您的藏匿。

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

git stash --include-untracked# orgit stash -u

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

这里有几个正确的答案,但我想指出的是,对于新的整个目录,'git add path'不是工作。所以如果你在未跟踪路径中有一堆新文件并这样做:

git add untracked-pathgit stash "temp stash"

这将隐藏以下消息:

Saved working directory and index state On master: temp stashwarning: unable to rmdir untracked-path: Directory not empty

如果未跟踪路径是您存储的唯一路径,则存储“temp stash”将是一个空存储。正确的方法是添加整个路径,而不仅仅是目录名(即以'/'结束路径):

git add untracked-path/git stash "temp stash"

在git bash中,隐藏未跟踪的文件是通过使用以下命令实现的

git stash --include-untracked# orgit stash -u

http://git-scm.com/docs/git-stash

git stash从您的工作区中删除任何未跟踪或未提交的文件。您可以使用以下命令恢复git stash

git stash pop

这将把文件放回本地工作区。

我的经验

我不得不对我的gitIgnore文件进行修改,以避免. classpath和. project文件移动到远程存储库中。从现在起,我不允许在远程仓库中移动这个修改后的. gitIgnore。

. classpath和. project文件对于eclipse很重要-这是我的java编辑器。

我首先有选择地添加了其余的文件并提交用于暂存。但是,除非修改后的. gitIgnore字段和未跟踪的文件(即. project和. classpath)不被隐藏,否则无法执行最终推送。

我用

git stash

用于存储修改后的. gitIgnore文件。

为了存储. classpath和. project文件,我使用了

git stash --include-untracked

并从我的工作区中删除了文件。缺乏这些文件会剥夺我在eclipse中处理工作位置的能力。我继续完成将提交的文件推送到远程的过程。一旦成功完成,我使用

git stash pop

这将相同的文件粘贴回我的工作区。这使我能够在eclipse中处理相同的项目。希望这能消除误解。

我能够通过以下操作隐藏只是未跟踪的文件:

git stash save "tracked files I'm working on"git stash save -u "untracked files I'm trying to stash"git stash pop stash@{1}

最后一个弹出跟踪文件的藏匿,从而只留下未跟踪的文件藏匿。

在git版本2.8.1上:以下对我有用。

将修改和未跟踪的文件保存在没有名称的stash中

git stash save -u

使用名称将修改和未跟踪的文件保存在stash中

git stash save -u <name_of_stash>

您可以稍后使用流行适用,如下所示。

git stash pop
git stash apply stash@{0}

你可以简单地用下面的命令

git stash save --include-untracked

git stash save -u

有关git stash访问此文章(点击这里)的更多信息

假设新的未跟踪文件被称为:“views.json”。如果您想通过隐藏应用程序的状态来更改分支,我通常键入:

git add views.json

然后:

git stash

它会被藏起来。然后我就可以换树枝了

git checkout other-nice-branch

如果您想隐藏未跟踪的文件,但保留索引文件(例如您即将提交的文件),只需将-k(保留索引)选项添加到-u

git stash -u -k

我在将Sourcetree与新创建的文件一起使用时遇到了类似的问题(它们也不会包含在存储中)。

当我第一次选择“阶段所有”,然后藏匿新添加的组件,跟踪,因此包括在藏匿。

2020年更新答案

我很惊讶这个页面上没有其他答案提到git stash push

这篇文章帮助我理解:

命令git stashgit stash push的简写。在此模式下,不允许使用非选项参数来防止拼写错误的子命令生成不需要的存储条目。此命令git stash save还有另一个别名,已被弃用以支持git stash push

默认情况下,git在存储时忽略未跟踪的文件。如果需要将这些文件添加到存储中,您可以使用-u选项告诉git包含未跟踪的文件。如果指定了-a选项,也可以添加被忽略的文件。-a将包括未跟踪和被忽略的文件。

我关心命名我的存储,我希望它们包含未跟踪的文件,所以我最常运行的命令是:git stash push -u -m "whatIWantToNameThisStash"

你如何隐藏一个未跟踪的文件?

git stash --include-untracked

存储在VS 2019及更高版本中可用。

  1. 转到Git更改窗口Ctrl + Alt + F7
  2. 现在按Commit AllCommit staged按钮附近的下拉键以查看隐藏选项

输入图片描述

如果您想隐藏未跟踪的文件,如Git ignored filesFiles which are not included into project,请选择此选项

输入图片描述

阅读此答案以在Visual Studio中充分使用Git stash:https://stackoverflow.com/a/69905607/4391394

新版本2.35

git stash的新--分阶段模式可以很容易地隐藏你在暂存区域中已经拥有的东西,而不是其他东西。你可以把它想象成git提交(它只写分阶段的更改),但它不是创建新的提交,而是向存储写入一个新条目。然后,当你准备好了,你可以恢复你的更改(使用git stash pop)并继续工作。

git add -Agit stash --staged