您如何存储未跟踪的文件?

我对一个文件进行了更改,再加上一个新文件,并希望在我切换到另一个任务时使用 git stash 进行保存。但是 git stash 本身仅存储对现有文件的更改;新文件保留在我的工作树中,使以后的工作变得混乱。我如何隐藏这个未跟踪的文件?

答案

要存储您的工作目录,包括未跟踪的文件(尤其是. gitignore 中的文件),则可能要使用此 cmd:

git stash --include-untracked

更多细节:

2018 年 5 月 17 日更新:

新版本的 git 现在具有git stash --all stash - 全部隐藏所有文件,包括未跟踪和忽略的文件。
git stash --include-untracked不再接触忽略的文件(在 git 2.16.2 上测试)。

原始答案如下:

警告,如果您在 gitignore 文件中有任何目录 / * 条目,这样做将永久删除您的文件。

从 1.7.7 版本开始,您可以使用git stash --include-untrackedgit stash save -u来存储未跟踪的文件而不进行暂存。

添加( git add )文件并开始跟踪它。然后藏起来。由于文件的全部内容都是新内容,因此将其隐藏起来,您可以根据需要进行操作。

从 git 1.7.7 开始, git stash接受--include-untracked选项(或简写-u )。要将未跟踪的文件包括在存储中,请使用以下命令之一:

git stash --include-untracked
git stash -u

警告,如果您在 gitignore 文件中有任何目录 / * 条目,这样做将永久删除您的文件。

将文件添加到索引:

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 文件和未跟踪的文件可见,否则无法执行最终推送。 .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 的注释中所述,您可能希望在git ls-files命令中添加--exclude-standard (因此, 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 ,以防万一您不希望popapply和 / 或希望能够指定特定的 stash 而不是只是拿第一名。也许这(而不是上面的第二个别名)[空格被剥离以适合而不滚动;重新添加以提高可读性]:

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}

最后一个弹出跟踪文件的存储,因此仅保留未跟踪文件。

如果要隐藏未跟踪的文件,但保留索引文件(例如,要提交的文件),只需在-u添加-k (保留索引)选项

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