题 我如何git存储特定文件? [重复]


可能重复:
如何从多个已更改的文件中隐藏一个文件 

如何存储特定文件,将当前已修改的其他文件保存在我要保存的存储区中?

例如,如果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

1032
2018-03-31 21:05


起源


“可能重复”的问题目前有一个标记为已接受的错误答案。 - Penguin Brian
您可以使用 git checkout -- filename 并将其恢复到原始状态。 - visualex
@visualex它确实会还原它,但不会存在它 - Jesper


答案:


编辑: 从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 将隐藏显示的大块和其余的帅哥藏在那个文件中。

不是最用户友好的方法,但如果你真的需要它可以完成工作。


1577
2018-03-31 21:19



这似乎没有做的唯一事情是包括对二进制文件的更改。我编辑了一些图形,做了git stash --patch方法,它们从未被列出。 - Jeremy Ricketts
繁琐,但有效。我希望有一种快速方法可以存储仅暂存的更改,然后在稍后弹出时将更改放入未分级的工作树中。 - James Johnston
@JamesJohnston git stash --keep-index 将允许您存储所有未分级的更改(与您要查找的相反)。 stackoverflow.com/a/8333163/378253 - Nicolas Wormser
如果你说 a 代替 y 它会隐藏那个hunk +文件的其余部分,这要快得多。 - i_am_jorf
@jeffamaphone很棒!也 d 将做相反的事情,即不在当前文件中隐藏任何进一步的帅哥。的确 ? 将显示所有可能的选项。 - omnikron


我通常会添加索引更改,我不想隐藏,然后使用--keep-index选项隐藏。

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

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


警告 正如评论中所指出的,这会将所有内容都放入存储中,无论是分阶段还是非分阶段。 -step-index只在保存完成后单独留下索引。以后弹出存储时,这可能会导致合并冲突。


247
2017-12-18 20:40



如果您不想使用--patch选项进行大量更改,这比接受的答案要好得多。 - quux00
不,这会将所有内容都放入存储中,无论是分阶段还是非分阶段。该 --keep-index 在存储完成后立即单独留下索引。所以这不是AFAICT问题的有效答案。 - Raman
请参阅我对@ Rachel的问题的答案,找出解决这个问题的方法(隐藏分阶段的更改,而不是未分阶段的更改) - stackoverflow.com/questions/3040833/... - JesusFreke
之后,如果您想要取回保存的文件而不提交您添加的文件,则可以运行 git stash; git stash pop stash@{1}。 - yndolok
警告:记下@拉曼的观点。这不应该做它应该做的事情。这将在存储中进行相同的更改 和 把它们留在工作树上。当您稍后尝试弹出存储时,您可能会遇到合并冲突,并且它们通常非常令人困惑且难以修复。 - rjmunro