Git如何暂存单个未被跟踪的文件?

13

问题:

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

贮藏文件列表

现在我想将未跟踪的文件(在这种情况下,它是 db/migrate/20161212071336_add_paranoid_fields.rb)贮藏起来,但不想贮藏已更改的文件。

我该怎么做?

为什么我要贮藏单个未跟踪的文件

我最初创建了这个文件,然后意识到我不需要它(为了使我的程序正常工作,它需要被删除),但我可能将来会需要它。

我搜索过的(没有给出答案)以及它们无法帮助的原因


2
以下的回答为什么不符合你的问题? - Maroun
2
存储未跟踪的文件的原因是什么?因为它不会计入任何提交。 - w.Bala
@MarounMaroun:stash -p 只会存储已跟踪的文件,但我想要存储未跟踪的文件。 - songyy
@w.Bala:在我的使用情况下,我现在认为我不需要这个文件,但是以后可能会需要。 - songyy
5个回答

9
在git版本2.21.0(Windows MingW64)中,您可以执行以下操作:
git stash push --include-untracked -- db/migrate/20161212071336_add_paranoid_fields.rb

仅指定的文件包含在存储中。您可以提供多个文件(已跟踪和未跟踪的文件),您所指定的文件将作为常规存储保存并检出,而其他文件保持不变。


4
如果你只有这一个未跟踪的文件,你可以执行以下操作:
git add -u
git stash --include-untracked --keep-index

这将仅向stash添加未跟踪的文件,并从工作目录中删除它们。

如果您有多个未跟踪的文件,而您只想将其中一个文件包含到stash中,则需要进行提交、单个文件的stash,然后重置。

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

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

谢谢,正是我想要的 :) 我之前没有考虑过“先提交”这种方法 :) - songyy
@songyy:在编程中,使用git是一个明智的做法:一旦提交了代码,就不会丢失,所以在进行一些疯狂的实验之前,如果有疑问,最好先提交代码。之后你总是可以重置的。 - rodrigo
你也可以使用短格式 git stash -u 代替 --include-untracked - Kyrol

2

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

感谢您的帖子...这并没有解决我的问题,但它提供了一种替代的开发方式。我会点赞的 :) 我认为@rodrigo的答案完美地解决了原始问题..你可能想看一下 :) - songyy
谢谢你的点赞。回复时存在竞态条件 :-) - Pierre de Buyl

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

我在另一个答案中提供了该方法的详细信息,以及为什么许多更简单的命令不起作用。
编辑:也许可以使用这个打补丁的方法来改善它,而不是提交。或者使用另一个存档。

1
与@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指出的那样,未跟踪的文件将再次恢复到暂存区。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接