我对一个文件进行了更改,再加上一个新文件,我想在切换到另一个任务时使用git stash将它们保存起来。但是git stash本身只存储对现有文件的更改;新文件仍保留在我的工作树中,打乱了我未来的工作。我如何保存这个未跟踪的文件?
当前回答
这里有几个正确的答案,但我想指出,对于新的整个目录,“git-add-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
如果未追踪的路径是你隐藏的唯一路径,那么“临时隐藏”将是一个空的隐藏。正确的方法是添加整个路径,而不仅仅是目录名(即以“/”结束路径):
git add untracked-path/
git stash "temp stash"
其他回答
将文件添加到索引:
git add path/to/untracked-file
git stash
索引的全部内容,加上对现有文件的任何未标记的更改,都将被放入存储库。
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版本2.8.1上:以下对我有用。
将已修改和未跟踪的文件保存在不带名称的存储中
git stash save -u
使用名称将已修改和未跟踪的文件保存在存储库中
git stash save -u <name_of_stash>
您可以稍后使用pop或apply,如下所示。
git stash pop
git stash apply stash@{0}
从git1.7.7开始,gitstash接受--include未跟踪选项(或短手-u)。要将未跟踪的文件包含在存储库中,请使用以下任一命令:
git stash --include-untracked
# or
git stash -u
警告:如果您的gitignore文件中有任何目录/条目,那么这样做将永久删除您的文件*
推荐文章
- Visual Studio Code无法检测已安装的Git
- 强制LF eol在git的回购和工作副本
- Git:在裸库中更改活动分支的正确方法?
- 删除git中的分支是否会将其从历史记录中删除?
- 防止在GitHub上推送到master ?
- 根据Git,谁是“我们”,谁是“他们”?
- git如何合并后樱桃采摘工作?
- Git搜索单个文件历史记录中的字符串
- Git命令显示所有(轻量级)标签创建日期
- Gitignore并没有忽视文件夹
- 什么时候用。git/info/exclude代替。gitignore来排除文件?
- 如何告诉git忽略个别行,即gitignore为特定行代码
- “git diff——耐心”是什么意思?
- 我如何在GitHub中为其他人的代码做出贡献?
- 签出旧的提交并使其成为新的提交