如何git存储特定文件?


1653

如何隐藏一个特定文件,而将其他当前已修改的文件保存在我要保存的隐藏文件之外?

例如,如果git status给我这样的话:

younker % gst      
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   app/controllers/cart_controller.php
#   modified:   app/views/cart/welcome.thtml
#
no changes added to commit (use "git add" and/or "git commit -a")

并且我只想隐藏app / views / cart / welcome.thtml,我该怎么做?类似的东西(但是,这当然行不通):

git stash save welcome_cart app/views/cart/welcome.thtml

57
当前“可能重复”问题的答案不正确,被标记为已接受。
企鹅布莱恩

6
您可以使用git checkout -- filename并将其还原为原始状态。
visualex

7
@visualex它确实会还原它,但不会隐藏它
Jesper

2
Re Penguin Brian的评论:是的,对于“ git的最新版本”,“可能重复的”问题的可接受答案链接到该问题。
火星

1
$ git stash-filename.ext
Linielson

Answers:


2509

编辑:自git 2.13起,有一个命令可保存到存储的特定路径:git stash push <path>。例如:

git stash push -m welcome_cart app/views/cart/welcome.thtml

老答案:

您可以使用git stash --patch(或git stash -p)进行操作-您将进入交互模式,在该模式下,您将看到每个更改的块。用于在遇到您想隐藏n的文件时跳过不想存放的文件y,并q退出并保留其余的文件。 a将显示的块和其他块存储在该文件中。

这不是最人性化的方法,但是如果您确实需要它,它可以完成工作。


32
繁琐,但有效。我希望有一种快速的方法可以仅存储已分阶段的更改,然后将这些更改保存到未分阶段的工作树中,然后将其弹出。
詹姆斯·约翰斯顿

56
@JamesJohnstongit stash --keep-index将允许您隐藏所有未进行的更改(与您要查找的相反)。stackoverflow.com/a/8333163/378253
nimser

123
如果您说a而不是y它将存储该块+文件的其余部分,则速度要快得多。
i_am_jorf

53
@jeffamaphone太好了!也d将执行相反的操作,即不在当前文件中存储任何其他块。并且确实?会显示所有可能的选项。
omn​​ikron

9
@Vencovsky代表“消息”,用于指定隐藏的可选描述。如果不需要,可以省去-m welcome_cart零件。
svick

336

我通常将不想存储的索引添加到索引更改中,然后使用--keep-indexoption存储。

git add app/controllers/cart_controller.php
git stash --keep-index
git reset

最后一步是可选的,但是通常您需要它。它从索引中删除更改。


警告 正如评论中所指出的,这会将所有内容(无论已上演还是未上演)都置于隐藏状态。在--keep-index刚刚离开指数仅藏匿完成后。当您稍后弹出存储时,这可能导致合并冲突。


5
如果您不想使用--patch选项进行大量更改,这比公认的答案要好得多。
quux00 2012年

181
不,这会将所有内容(无论已上演还是未上演)都置于隐藏状态。在--keep-index刚刚离开指数仅藏匿完成后。因此,这不是AFAICT这个问题的有效答案。
拉曼

2
见我的回答对@ Rachel的问题的解决方案,这样做的这个倒数(积攒上演的变化,而不是不分阶段的变化) - stackoverflow.com/questions/3040833/...
JesusFreke

3
之后,如果您想取回保存的文件而不提交所添加的文件,则可以运行git stash; git stash pop stash@{1}
yndolok

8
警告:请注意@Raman的观点。这没有做应做的事情。这会将相同的更改放入存储区,并将其保留在工作树中。当您以后尝试弹出存储时,您可能会遇到合并冲突,并且它们通常确实令人困惑且难以解决。
rjmunro

28

为了增加svick的答案,该-m选项只是向您的藏匿处添加一条消息,并且是完全可选的。因此,命令

git stash push [paths you wish to stash]

是完全有效的。因此,例如,如果我只想将更改存储在src/目录中,则可以运行

git stash push src/
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.