我对一个文件进行了更改,加上一个新文件,并希望在切换到另一个任务时使用 git stash 将它们收起来。但是 git stash 本身只存储对现有文件的更改;新文件保留在我的工作树中,使我未来的工作变得混乱。如何存储这个未跟踪的文件?
18 回答
要存储您的工作目录,包括未跟踪的文件(尤其是那些在 中的文件.gitignore
),那么您可能想要使用这个 cmd:
git stash --include-untracked
或者,您可以使用简写-u
代替--include-untracked
,或者简单地使用git stash --all
它来存储所有文件,包括未跟踪和忽略的文件。这种行为在 2018 年发生了变化,因此请确保您的 git 是最新的。
警告:似乎有(或曾经有过)被忽略目录的内容可以被永久删除的情况。有关详细信息,请参阅此存档网站。
从 git 1.7.7 开始,git stash
接受--include-untracked
选项(或简写-u
)。要在存储中包含未跟踪的文件,请使用以下任一命令:
git stash --include-untracked
# or
git stash -u
警告,如果您的 gitignore 文件中有任何目录/条目,这样做将永久删除您的文件。*
将文件添加到索引中:
git add path/to/untracked-file
git stash
索引的全部内容,加上对现有文件的任何未暂存的更改,都会将其放入存储中。
在 git bash 中,隐藏未跟踪文件是通过使用命令实现的
git stash --include-untracked
# or
git 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 版本 2.8.1 上:以下对我有用。
将已修改和未跟踪的文件保存在没有名称的存储中
git stash save -u
使用名称将已修改和未跟踪的文件保存在 stash 中
git stash save -u <name_of_stash>
您可以使用pop或稍后应用,如下所示。
git stash pop
git stash apply stash@{0}
正如其他地方所说,答案是git add
文件。例如:
git add path/to/untracked-file
git stash
但是,另一个答案中也提出了这个问题:如果您真的不想添加文件怎么办?好吧,据我所知,你必须这样做。以下将不起作用:
git add -N path/to/untracked/file # note: -N is short for --intent-to-add
git stash
这将失败,如下所示:
path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state
所以,你可以做什么?好吧,您必须真正添加文件,但是,您可以稍后有效地取消添加它,使用git rm --cached
:
git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file
然后您可以继续工作,以与之前相同的状态git add
(即使用名为path/to/untracked-file
; 的未跟踪文件以及您可能必须对跟踪文件进行的任何其他更改)。
对此工作流程的另一种可能性是:
git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git 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'
请注意,后者作为 shell 脚本或函数可能会更好,以允许将参数提供给git stash
,以防万一您不想要pop
butapply
和/或希望能够指定特定的存储,而不是仅仅获取顶部一。也许这个(而不是上面的第二个别名)[空白被剥离以适应不滚动;重新添加以提高可读性]:
function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}
注意:在这种形式中,如果您要提供存储标识符,则需要提供操作参数以及标识符,例如unstashall apply stash@{1}
或unstashall pop stash@{1}
当然,你会投入你的.zshrc
或同等的东西来长期存在。
希望这个答案对某人有所帮助,将所有内容放在一个答案中。
2020 年更新的答案
令我惊讶的是,此页面上没有提到其他答案git stash push
。
这篇文章帮助我理解了:
该命令
git stash
是git stash push
. 在这种模式下,不允许使用非选项参数来防止拼写错误的子命令生成不需要的隐藏条目。此命令还有另一个别名git stash save
,已弃用,取而代之的是git stash push
.默认情况下,git 在进行存储时会忽略未跟踪的文件。如果需要将这些文件添加到存储中,您可以使用
-u
选项告诉 git 包含未跟踪的文件。-a
如果指定了选项,也可以添加忽略的文件。-a
将包括未跟踪和忽略的文件。
我关心命名我的存储,我希望它们包含未跟踪的文件,所以我最常运行的命令是: git stash push -u -m "whatIWantToNameThisStash"
我可以通过以下方式仅存储未跟踪的文件:
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}
最后一个会弹出已跟踪文件的存储,因此只保留未跟踪的文件。
如果您想存储未跟踪的文件,但保留索引文件(例如您即将提交的文件),只需将-k
(keep index) 选项添加到-u
git stash -u -k
您可以使用以下命令简单地做到这一点
git stash save --include-untracked
或者
git stash save -u
有关 git stash 的更多信息,请访问此帖子(单击此处)
假设新的和未跟踪的文件被称为:“views.json”。如果您想通过隐藏应用程序的状态来更改分支,我通常会输入:
git add views.json
然后:
git stash
它会被藏起来。然后我可以改变分支
git checkout other-nice-branch
2.35 版中的新功能
git stash 的新 --staged 模式可以轻松地隐藏暂存区域中已有的内容,仅此而已。你可以把它想象成 git commit(它只写入分阶段的更改),但它不是创建一个新的提交,而是向存储写入一个新条目。然后,当您准备好时,您可以恢复您的更改(使用 git stash pop)并继续工作。
git add -A
git stash --staged
我认为这可以通过告诉 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 stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state
这里有几个正确的答案,但我想指出,对于新的整个目录,'git add path'
将不起作用。因此,如果您在untracked-path中有一堆新文件,请执行以下操作:
git add untracked-path
git stash "temp stash"
这将隐藏以下消息:
Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty
如果untracked-path是您要存储的唯一路径,则存储“临时存储”将是一个空存储。正确的方法是添加整个路径,而不仅仅是目录名(即以'/'结束路径):
git add untracked-path/
git stash "temp stash"
我在将 Sourcetree 与新创建的文件一起使用时遇到了类似的问题(它们也不会包含在存储中)。
当我第一次选择“全部暂存”然后将新添加的组件存储在跟踪位置并因此包含在存储中时。
您如何存储未跟踪的文件?
git stash --include-untracked
Stashing 在 VS 2019 及更高版本中可用。
- 转到 Git 更改窗口
Ctrl + Alt + F7
- 现在按附近的下拉键
Commit All
或Commit staged
按钮以查看存储选项
如果您想存储未跟踪的文件,Git ignored files
或者Files which are not included into project
然后选择此选项
阅读此答案以在 Visual Studio 中充分使用 Git stash: https ://stackoverflow.com/a/69905607/4391394
我曾经思考和渴望相同的功能。但随着时间的推移,我注意到它确实不需要。存储时,可以保留新文件。他们不会发生任何“坏事”(当您检查其他内容时,git 会出错并且不会覆盖现有的未跟踪文件)
git stash
而且由于通常和之间的时间范围git stash pop
很小,因此您将很快再次需要未跟踪的文件。因此,我想说的是,当git status
您在处理其他事情(在git stash
和git stash pop
你的藏匿处。