Git stash单个未跟踪文件?

问题描述 投票:4回答:5

题:

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

Stash File List

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

我该怎么办?

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

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

What I've searched (and not giving me an answer), and the reason why they don't help

git git-stash
5个回答
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^

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


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而不是提交进行改进。或者可能使用另一个藏匿处


1
投票

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

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


0
投票

在git版本2.21.0(Windows MingW64)

你可以做:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.