我对一个文件进行了更改,加上一个新文件,并希望在切换到另一个任务时使用 git stash 将它们收起来。但是 git stash 本身只存储对现有文件的更改;新文件保留在我的工作树中,使我未来的工作变得混乱。如何存储这个未跟踪的文件?
git stash show
不返回任何内容,您可能会想删除它(就像我刚刚在它包含我编写的有用脚本时所做的那样几个月前 → how to recover a dropped stash)
要存储您的工作目录,包括未跟踪的文件(尤其是 .gitignore
中的文件),您可能需要使用此 cmd:
git stash --include-untracked
或者,您可以使用简写 -u
而不是 --include-untracked
,或者简单地使用 git stash --all
来存储所有文件,包括 untracked 和 ignored 文件。这种行为在 2018 年发生了变化,因此请确保您的 git 是最新的。
警告:似乎存在(或曾经存在)被忽略目录的内容可能被永久删除的情况。 See this archived website for more information。
从 git 1.7.7 开始,git stash
接受 --include-untracked
选项(或简写 -u
)。要在存储中包含未跟踪的文件,请使用以下任一命令:
git stash --include-untracked
# or
git stash -u
警告,如果您的 gitignore 文件中有任何目录/条目,这样做将永久删除您的文件。*
.gitignore
中的内容看起来像 ignoredDirectory
而不是 ignoredDirectory/*
,它仍然会删除那些未跟踪的。甚至未跟踪的文件也不仅仅是目录。
*.extension
条目?
git
1.8.3 -u
(--include-untracked
) 选项可以存储和弹出未跟踪的文件,但 git stash show
不会列出存储中的未跟踪文件
将文件添加到索引中:
git add path/to/untracked-file
git stash
索引的全部内容,加上对现有文件的任何未暂存的更改,都会将其放入存储中。
git add .
出于某种原因没有考虑到它
--include-untracked
将拾取所有内容,尤其是隐藏目录;像 node_modules
或 .pytest_cache
以及任何不在 .gitignore
中的东西。
git reset
将清除对索引的更改,但将它们留在工作树中,因为默认模式是 --mixed
。
在 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 中处理同一个项目。希望这能消除误解。
~/.gitignore
。
git stash show
只列出了修改过的文件,而不是未跟踪的文件......最初,我认为我失去了很多工作......
在 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 stash show
没有显示。当我尝试 git stash apply
时,我收到“错误:无法从存储中恢复未跟踪的文件”。但是,这些文件随后再次被列为未跟踪,但未恢复对已跟踪文件的更改。我认为这些文件可以通过将它们从存储库中检出来单独恢复,但这个解决方案并不是我所希望的。
git stash apply
时出错。请注意,添加 stash@{0}
仅告诉 git 您正在尝试应用最近的存储,这在省略时是隐含的,因此没有必要。也许自 2018 年以来发生了一些变化,或者我的情况有所不同,但我认为人们应该了解我的经历,因为这对我来说是出乎意料的。这并不意味着您的解决方案对某些人没有用。
正如其他地方所说,答案是 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
而需要 apply
,和/或希望能够指定特定的藏匿处,而不仅仅是拿走顶部的藏匿处。也许这个(而不是上面的第二个别名)[空白被剥离以适应不滚动;重新添加以提高可读性]:
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
。
This article 帮助我理解:
命令 git stash 是 git stash push 的简写。在这种模式下,不允许使用非选项参数来防止拼写错误的子命令生成不需要的隐藏条目。此命令还有另一个别名 git stash save 已弃用,取而代之的是 git stash push。默认情况下,git 在进行存储时会忽略未跟踪的文件。如果需要将这些文件添加到存储中,您可以使用 -u 选项告诉 git 包含未跟踪的文件。如果指定了 -a 选项,也可以添加忽略的文件。 -a 将包括未跟踪和忽略的文件。
我关心命名我的存储,我希望它们包含未跟踪的文件,所以我最常运行的命令是: git stash push -u -m "whatIWantToNameThisStash"
git stash push path/to/some/file -u
我可以通过以下方式仅存储未跟踪的文件:
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 stash save -u
不仅保存 untracked
文件,还保存 tracked
和 untracked
。我认为在这种情况下,您所做的第一次保存不是必需的。 atlassian.com/git/tutorials/saving-changes/… 中有一个很好的图表
2.35 版中的新功能
git stash 的新 --staged 模式可以轻松地隐藏暂存区域中已有的内容,仅此而已。你可以把它想象成 git commit (它只写入分阶段的更改),但它不是创建一个新的提交,而是将一个新的条目写入存储。然后,当您准备好时,您可以恢复您的更改(使用 git stash pop)并继续工作。
git add -A
git stash --staged
如果您想存储未跟踪的文件,但保留索引文件(例如您将要提交的文件),只需将 -k
(保留索引)选项添加到 -u
git stash -u -k
您可以使用以下命令简单地做到这一点
git stash save --include-untracked
或者
git stash save -u
有关 git stash Visit this post (Click Here) 的更多信息
假设新的和未跟踪的文件被称为:“views.json”。如果您想通过隐藏应用程序的状态来更改分支,我通常会输入:
git add views.json
然后:
git stash
它会被藏起来。然后我可以改变分支
git checkout other-nice-branch
您如何存储未跟踪的文件?
git stash --include-untracked
Stashing 在 VS 2019 及更高版本中可用。
转到 Git 更改窗口 Ctrl + Alt + F7 现在按 Commit All 或 Commit staged 按钮附近的下拉键以查看存储选项
https://i.stack.imgur.com/f1HcN.png
如果您想存储 Git ignored files
或 Files which are not included into project
等未跟踪文件,请选择此选项
https://i.stack.imgur.com/SMvy2.png
阅读此答案以在 Visual Studio 中充分使用 Git stash: https://stackoverflow.com/a/69905607/4391394
我认为这可以通过告诉 git 文件存在来解决,而不是将其所有内容提交到暂存区,然后调用 git stash
。 araqniddescribes前怎么做。
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 会出错并且不会覆盖现有的未跟踪文件)
由于 git stash
和 git stash pop
之间的时间范围通常很小,因此您很快就会再次需要未跟踪的文件。所以我想说,当您处理其他内容(在 git stash
和 git stash pop
之间)时,文件显示在 git status
中的不便比工作造成的不便和需要注意的不便要小尝试将未跟踪的文件添加到您的存储中的成本。
不定期副业成功案例分享
git stash --all
之前列出git stash --include-untracked
。首先,它现在在 2019 年更好地回答了 OP 的问题,其次是因为 --all 做了大多数用户可能不想要的事情,因为它删除了所有 .gitignored 的文件