如何存储特定文件,而将当前修改的其他文件留在我要保存的存储中?
例如,如果 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
git checkout -- filename
并将其恢复为原始状态。
编辑: 从 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
将在该文件中存储显示的块和其余块。
不是最用户友好的方法,但如果你真的需要它,它可以完成工作。
我通常会添加我不想隐藏的索引更改,然后使用 --keep-index
选项进行隐藏。
git add app/controllers/cart_controller.php
git stash --keep-index
git reset
最后一步是可选的,但通常是您想要的。它从索引中删除更改。
警告 如评论中所述,git stash --keep-index
将所有内容都推送到存储区,包括分阶段和非分阶段。 --keep-index
只是在存储完成后单独保留索引。当您稍后弹出存储时,这可能会导致合并冲突。
--keep-index
只是在存储完成后单独保留索引。所以这不是问题的有效答案,AFAICT。
git stash; git stash pop stash@{1}
。
要添加到 svick 的答案,-m
选项只是将一条消息添加到您的存储中,并且完全是可选的。因此,命令
git stash push [paths you wish to stash]
是完全有效的。例如,如果我只想在 src/
目录中存储更改,我可以运行
git stash push src/
git stash pop
。
存放一个文件:
git stash -- filename.txt
存放多个文件:
git stash -- filename1.txt filename2.txt
如果您使用的是 Visual Studio 代码,则有一种更简单的方法来存储选定的文件。
确保您已经在 VSCode 中安装了 GitLens 扩展 转到源代码控制选项卡 选择要存储的文件 右键单击它,您将看到许多选项。单击存储更改
https://i.stack.imgur.com/WyLoP.png
现在它会要求您添加一些隐藏消息。添加可理解的消息并按 Enter。
https://i.stack.imgur.com/miXZb.png
简短而简单的解决方案:
git stash -- finename.ext
在你的情况下git stash -- app/views/cart/welcome.thtml
https://i.stack.imgur.com/vEa91.gif
请注意,Fork(这对 Google 来说是一个难以理解的名称!)不是免费软件,在评估期结束后需要 50 美元,但您可以像 WinRAR 或 WinZip 一样忽略弹出窗口。
暂存您不想隐藏的更改。使用以下命令存储剩余的未暂存文件:
$ git stash save <give_it_a_name> --keep-index
未暂存的文件现在已隐藏。使用您的命名存储查看存储列表:
$ git stash list
stash@{0}: On mybranch: WIP220412-1119am
stash@{1}: On mybranch: WIP220312-749am
要恢复隐藏的文件:
$ git stash apply stash@{<index_of_saved_stash>}
$ git stash apply stash@{0}
隐藏在 WIP220412-1119am 中的更改现已恢复。并且存储列表也仍然存在,(而不是“git stash pop”,您可以通过这种方式保留列表。)
--keep-index
标志。
@svick 发布了一个很好的答案。我想存储我所有的 .java 文件并保持 build.gradle 不变,所以我运行:
git stash push *.java
在 vs-code 的 Source Control 选项卡中,按住 shift 键,然后选择要存储的文件,然后右键单击并选择 stash changes 选项。
git stash --keep-index
将允许您隐藏所有未暂存的更改(与您正在寻找的相反)。 stackoverflow.com/a/8333163/378253a
而不是y
,它将存储大块 + 文件的其余部分,这要快得多。d
也将做相反的事情,即不在当前文件中存储任何进一步的块。实际上?
将显示所有可能的选项。-m welcome_cart
部分省略。