Git 隐藏单个未跟踪文件?

Git stash single untracked file?

问题:

我有几个编辑过的文件如下所列,还有一些新创建的文件

现在我想存储未跟踪的文件(在本例中,它是 db/migrate/20161212071336_add_paranoid_fields.rb,但不存储更改的文件)。

我应该怎么做?

为什么我要隐藏一个未跟踪的文件

我一开始创建了这个文件,后来我意识到我现在并不需要它(需要删除它才能使我的程序正常运行);但我以后可能需要它。

我搜索过的内容(没有给我答案),以及他们没有帮助的原因

stash 不提供此功能。由于您要实现的是将此文件保留为附加开发的一部分,因此最好将其保留在分支中。

步骤:

  1. 隐藏修改过的文件(您要保留的文件将保持不变,因为它没有被跟踪。
  2. 创建一个新分支并在那里记录文件
  3. 回到原来的分支

命令:

git stash
git checkout -b paranoid_fields
git add db/migrate/20161212071336_add_paranoid_fields.rb
git commit
git checkout master
git stash pop

当您想要恢复文件时:

git merge paranoid_fields

会还给它。

如果您只想看一下文件:

git show paranoid_fields:db/migrate/20161212071336_add_paranoid_fields.rb

如果您只有一个未跟踪的文件,您可以这样做:

git add -u
git stash --include-untracked --keep-index

这只会将未跟踪的文件添加到存储中,并将它们从工作目录中删除。

如果您有多个未跟踪的文件并且只想将这个文件包含到存储中,那么您将必须执行提交,然后是单个文件的存储,然后是重置

git add -u
git commit -m "temp commit"
git add my_file_to_stash
git stash
git reset --hard HEAD^

这里的微妙之处在于,当您稍后恢复存储时,该文件将被添加到索引中。这可能是一件好事,因为它会提醒您此文件很重要。

根据其他答案中提供的信息,我创建了一个脚本 git-stash-selection,我将其作为 gsts:

的别名
#!/bin/sh
#
# Git stash only a selection of files, with a message.
#
# Usage:
#   git-stash-selection [<message>] [<paths>...]

message=
shift
stash_paths="$*"
git add --all
git reset $stash_paths
git commit --allow-empty -m "temp - excluded from stash"
git add --all
git stash save $message
git reset --soft HEAD^
git reset

我已经提供了 full details in another answer 它使用的方法以及为什么一些更简单的命令不起作用。

编辑:这可能可以使用 this patch method 而不是提交来改进。或者也许使用另一个 stash

类似于@rodrigo 的回答,但没有提交和重置。

您可以git stash将所有当前已修改、跟踪的文件存储在位置stash@{0}

然后您可以 git add <filename> 您想要隐藏的未跟踪文件,然后再次 git stash

运行 git stash list 将显示现在未跟踪的文件存储在 stash@{0} 中,您修改的跟踪文件存储在 stash@{1}.

现在您可以简单地 git stash pop stash@{1} 从存储中删除修改后的跟踪文件并将它们放回您的工作目录,这样您未跟踪的文件就会存储在 stash@{0}.

您可以使用 git stash show -p stash@{0} 查看您的文件并使用 git stash apply stash@{0}git stash pop stash@{0} 恢复它。正如@rodrigo 指出的那样,未跟踪的文件将再次恢复到暂存区。

在 git 版本 2.21.0 (Windows MingW64)

你可以这样做:

git stash push --include-untracked -- db/migrate/20161212071336_add_paranoid_fields.rb

只有指定的文件包含在存储中。您可以提供多个文件(未跟踪和跟踪的),您指定的文件将被隐藏并正常检出,其他文件保持原样。