我对一个文件进行了更改,再加上一个新文件,我想在切换到另一个任务时使用git stash将它们保存起来。但是git stash本身只存储对现有文件的更改;新文件仍保留在我的工作树中,打乱了我未来的工作。我如何保存这个未跟踪的文件?
当前回答
要隐藏包含未跟踪文件(尤其是.gitignore中的文件)的工作目录,您可能需要使用以下cmd:
git stash --include-untracked
或者,您可以使用缩写-u来代替--include untracked,或者简单地使用git stash--all来存储所有文件,包括未跟踪和忽略的文件。2018年,这个数字发生了变化,所以请确保您的数字是最新的。
警告:似乎存在(或曾经存在)被忽略目录的内容可能被永久删除的情况。有关详细信息,请参阅此存档网站。
其他回答
你如何隐藏未追踪的文件?
git stash --include-untracked
将文件添加到索引:
git add path/to/untracked-file
git stash
索引的全部内容,加上对现有文件的任何未标记的更改,都将被放入存储库。
要隐藏包含未跟踪文件(尤其是.gitignore中的文件)的工作目录,您可能需要使用以下cmd:
git stash --include-untracked
或者,您可以使用缩写-u来代替--include untracked,或者简单地使用git stash--all来存储所有文件,包括未跟踪和忽略的文件。2018年,这个数字发生了变化,所以请确保您的数字是最新的。
警告:似乎存在(或曾经存在)被忽略目录的内容可能被永久删除的情况。有关详细信息,请参阅此存档网站。
2020年更新答案
我很惊讶,这个页面上没有其他答案提到git stash push。
这篇文章帮助我理解了:
命令gitstash是gitstashpush的简写。在此模式下,不允许使用非选项参数来防止拼写错误的子命令生成不需要的隐藏项。这个命令git stash save还有另一个别名,它已被弃用,取而代之的是git stass push。默认情况下,git在执行隐藏时忽略未跟踪的文件。如果需要将这些文件添加到stash中,可以使用-u选项,告诉git包括未跟踪的文件。如果指定了-a选项,也可以添加忽略的文件-a将包括未跟踪和忽略的文件。
我关心命名我的存储,我希望它们包含未跟踪的文件,所以我最常用的命令是:git stash push-u-m“whatIWantToNameThisStash”
正如其他地方所说,答案是git添加文件。例如。:
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添加之前的状态相同(即,使用名为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的评论中所提到的,您可能希望在git-ls-files命令中添加--exclude standard(因此,git-ls-file-o--excludestandard)。]
…这也可以很容易地编写脚本——即使是别名也可以(以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而是应用,和/或希望能够指定特定的stash,而不是只使用顶部的一个。也许是这样(而不是上面的第二个别名)[去掉空格以适应无需滚动;重新添加以增加易读性]:
function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}
注意:在此表单中,如果要提供存储标识符,则需要提供操作参数和标识符,例如unsshall apply stash@{1}或unsshall pop stash@}
当然,你会把你的.zshrc或同等文件放进去,以使其长期存在。
希望这个答案对某人有帮助,将所有事情都放在一个答案中。
推荐文章
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别
- GitHub -致命:无法读取用户名https://github.com':没有这样的文件或目录
- 撤消git平分错误
- 使用.gitconfig配置diff工具
- 如何配置Mac OS X术语,使git有颜色?
- Visual Studio Code: .git文件夹/文件隐藏
- “node_modules”文件夹应该包含在git存储库中吗
- 为什么git-rebase给了我合并冲突,而我所做的只是压缩提交?
- 当我试图推到原点时,为什么Git告诉我“没有这样的远程‘原点’”?