Git 隐藏单个未跟踪文件?
Git stash single untracked file?
问题:
我有几个编辑过的文件如下所列,还有一些新创建的文件
现在我想存储未跟踪的文件(在本例中,它是 db/migrate/20161212071336_add_paranoid_fields.rb
,但不存储更改的文件)。
我应该怎么做?
为什么我要隐藏一个未跟踪的文件
我一开始创建了这个文件,后来我意识到我现在并不需要它(需要删除它才能使我的程序正常运行);但我以后可能需要它。
我搜索过的内容(没有给我答案),以及他们没有帮助的原因
- How do you stash an untracked file?
- 这将隐藏所有文件;我只想隐藏一个文件。
- how can I git stash a specific file?
- 它建议使用
stash -p
,但这只会隐藏跟踪的文件。
stash 不提供此功能。由于您要实现的是将此文件保留为附加开发的一部分,因此最好将其保留在分支中。
步骤:
- 隐藏修改过的文件(您要保留的文件将保持不变,因为它没有被跟踪。
- 创建一个新分支并在那里记录文件
- 回到原来的分支
命令:
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
只有指定的文件包含在存储中。您可以提供多个文件(未跟踪和跟踪的),您指定的文件将被隐藏并正常检出,其他文件保持原样。
问题:
我有几个编辑过的文件如下所列,还有一些新创建的文件
现在我想存储未跟踪的文件(在本例中,它是 db/migrate/20161212071336_add_paranoid_fields.rb
,但不存储更改的文件)。
我应该怎么做?
为什么我要隐藏一个未跟踪的文件
我一开始创建了这个文件,后来我意识到我现在并不需要它(需要删除它才能使我的程序正常运行);但我以后可能需要它。
我搜索过的内容(没有给我答案),以及他们没有帮助的原因
- How do you stash an untracked file?
- 这将隐藏所有文件;我只想隐藏一个文件。
- how can I git stash a specific file?
- 它建议使用
stash -p
,但这只会隐藏跟踪的文件。
- 它建议使用
stash 不提供此功能。由于您要实现的是将此文件保留为附加开发的一部分,因此最好将其保留在分支中。
步骤:
- 隐藏修改过的文件(您要保留的文件将保持不变,因为它没有被跟踪。
- 创建一个新分支并在那里记录文件
- 回到原来的分支
命令:
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
只有指定的文件包含在存储中。您可以提供多个文件(未跟踪和跟踪的),您指定的文件将被隐藏并正常检出,其他文件保持原样。