我对文件进行了更改,加上一个新文件,并希望在切换到另一个任务时使用git stash将它们删除。但git stash本身只会隐藏对现有文件的更改;新文件仍然存在于我的工作树中,使我未来的工作变得混乱。如何存放这个未跟踪的文件?
要存储您的工作目录,包括未跟踪的文件(尤其是.gitignore中的文件),那么您可能想要使用此cmd:
git stash --include-untracked
2018年5月17日更新:
新版本的git现在有git stash --all
,它存放所有文件,包括未跟踪和忽略的文件。
git stash --include-untracked
不再触及被忽略的文件(在git 2.16.2上测试)。
原答案如下:
从版本1.7.7开始,您可以使用git stash --include-untracked
或git stash save -u
来存储未跟踪的文件,而无需对其进行暂存。
添加(git add
)文件并开始跟踪它。然后藏匿。由于文件的全部内容都是新的,因此它们将被隐藏,您可以根据需要对其进行操作。
我们假设调用了新的未跟踪文件:“views.json”。如果你想通过存储你的应用程序状态来改变分支,我通常输入:
git add views.json
然后:
git stash
它会被藏起来。然后我可以改变分支
git checkout other-nice-branch
这里有几个正确的答案,但我想指出,对于新的整个目录,'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
如果未跟踪路径是你要存放的唯一路径,那么藏匿的“临时存储”将是一个空藏匿的存储。正确的方法是添加整个路径,而不仅仅是目录名称(即以'/'结束路径):
git add untracked-path/
git stash "temp stash"
我认为这可以通过告诉git文件存在,而不是将其所有内容提交到临时区域,然后调用git stash
来解决。 Araqnid describes如何做前者。
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会出错而不会覆盖现有的未跟踪文件)
因为通常git stash
和git stash pop
之间的时间范围相当小,所以你需要再次快速地需要未跟踪的文件。所以我要说的是,当你正在处理其他东西(在git status
和git stash
之间)时出现在git stash pop
的文件的不便之处小于工作所带来的不便,并且需要注意它会花费额外的费用来尝试添加未记录的文件到你的藏匿处。
从git 1.7.7开始,git stash
接受--include-untracked
选项(或简称-u
)。要在存储中包含未跟踪的文件,请使用以下任一命令:
git stash --include-untracked
git stash -u
将文件添加到索引:
git add path/to/untracked-file
git stash
索引的全部内容以及对现有文件的任何未分级更改都将进入存储。
在git bash中,使用该命令可以实现对未跟踪文件的存储
git stash --include-untracked
要么
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 fiels和未跟踪的文件,否则无法执行最终推送。 .project和.classpath没有被隐藏。
我用了
git stash
用于存储修改后的.gitIgnore文件。
对于存储.classpath和.project文件,我用过
git stash --include-untracked
它从我的工作区中删除了文件。缺少这些文件会剥夺我在eclipse中工作的能力。我继续完成将提交的文件推送到远程的过程。一旦成功完成,我就用了
git stash pop
这会将相同的文件粘贴回我的工作区。这让我有机会在eclipse中处理同一个项目。希望这可以撇开误解。
正如其他地方所说,答案是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
或同等物品放在长期存在的地方。
希望这个答案对某人有帮助,将所有内容整合在一起。
在git版本2.8.1:以下为我工作。
在没有名称的存储中保存已修改和未跟踪的文件
git stash save -u
使用名称保存已存储的已修改和未跟踪文件
git stash save -u <name_of_stash>
您可以使用pop和以后应用,如下所示。
git stash pop
git stash apply stash@{0}
通过执行以下操作,我能够隐藏未跟踪的文件:
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
(保持索引)选项添加到-u
git stash -u -k
您只需使用以下命令即可
git stash save --include-untracked
要么
git stash save -u
有关git stash Visit this post (Click Here)的更多信息