Git stash单个未跟踪文件?

时间:2016-12-12 07:49:13

标签: git git-stash

问题:

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

Stash File List

现在我要隐藏未跟踪的文件(在这种情况下,它是db/migrate/20161212071336_add_paranoid_fields.rb,但不会存储已更改的文件。)

我该怎么做?

为什么我要存储一个未跟踪的文件

我首先创建了这个文件,然后我意识到我不需要立即(需要删除它才能使我的程序正常工作);但我将来可能会需要它。

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

的原因

5 个答案:

答案 0 :(得分:4)

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

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^

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

答案 1 :(得分:2)

关闭其他答案中提供的信息,我创建了一个脚本git-stash-selection,我使用别名gsts

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

message=$1
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而不是提交来改进。或者也许使用另一个藏匿

答案 2 :(得分:1)

stash不提供此功能。您想要实现的目标是将此文件作为其他开发的一部分,最好将其保存在分支中。

步骤:

  1. 存储已修改的文件(您要保留的文件将保持不变,因为它未被跟踪。
  2. 创建一个新分支并在那里记录文件
  3. 回到原来的分支
  4. 命令:

    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
    

答案 3 :(得分:0)

类似于@ 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指出的那样,未跟踪的文件将再次恢复到临时区域。

答案 4 :(得分:0)

在git版本2.21.0(Windows MingW64)中

您可以这样做:

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

隐藏文件中仅包含指定的文件。您可以提供多个文件(未跟踪和跟踪的),并且您指定的内容将作为存储区并按正常方式检出,其他文件保持原样。