ChatGPT解决这个技术问题 Extra ChatGPT

我怎样才能 git stash 一个特定的文件?

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

例如,如果 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 并将其恢复为原始状态。
@visualex 它确实会还原它,但不会隐藏它
Re Penguin Brian 的评论:是的,对于最新版本的 git,“可能重复”问题的已接受答案链接到此问题。
$ git stash -- 文件名.ext

p
piet.t

编辑: 从 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 将在该文件中存储显示的块和其余块。

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


麻烦,但有效。我希望有一种快速的方法来仅存储暂存的更改,然后在以后弹出时将更改放入未暂存的工作树中。
@JamesJohnston git stash --keep-index 将允许您隐藏所有未暂存的更改(与您正在寻找的相反)。 stackoverflow.com/a/8333163/378253
如果您说 a 而不是 y ,它将存储大块 + 文件的其余部分,这要快得多。
@jeffamaphone 太棒了! d 也将做相反的事情,即不在当前文件中存储任何进一步的块。实际上 ? 将显示所有可能的选项。
@Vencovsky 它代表“消息”,用于指定存储的可选描述。如果您不需要,可以将 -m welcome_cart 部分省略。
A
Anton Menshov

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

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

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

警告 如评论中所述,git stash --keep-index 将所有内容都推送到存储区,包括分阶段和非分阶段。 --keep-index 只是在存储完成后单独保留索引。当您稍后弹出存储时,这可能会导致合并冲突。


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

要添加到 svick 的答案,-m 选项只是将一条消息添加到您的存储中,并且完全是可选的。因此,命令

git stash push [paths you wish to stash]

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

git stash push src/

注意:弹出是在没有路径的情况下完成的,只需 git stash pop
H
HongchaoZhang

存放一个文件:

git stash -- filename.txt

存放多个文件:

git stash -- filename1.txt filename2.txt

A
Akshay

如果您使用的是 Visual Studio 代码,则有一种更简单的方法来存储选定的文件。

确保您已经在 VSCode 中安装了 GitLens 扩展 转到源代码控制选项卡 选择要存储的文件 右键单击它,您将看到许多选项。单击存储更改

https://i.stack.imgur.com/WyLoP.png

现在它会要求您添加一些隐藏消息。添加可理解的消息并按 Enter。

https://i.stack.imgur.com/miXZb.png


我的节目:丢弃更改,阶段更改,添加到 gitignore。不藏匿
@SomeoneSomewhere 尝试使用 GitLens 扩展
适用于许多 vscode 用户的绝佳解决方案,无需摆弄命令
V
Vicky P

简短而简单的解决方案:

git stash -- finename.ext

在你的情况下git stash -- app/views/cart/welcome.thtml


什么版本的 git 支持这个?我在 2.1.4 上,不支持。
嗨@JellicleCat 我正在使用 2.31.1
g
georgiecasey

https://i.stack.imgur.com/vEa91.gif

请注意,Fork(这对 Google 来说是一个难以理解的名称!)不是免费软件,在评估期结束后需要 50 美元,但您可以像 WinRAR 或 WinZip 一样忽略弹出窗口。


B
Brent Worden

暂存您不想隐藏的更改。使用以下命令存储剩余的未暂存文件:

$ 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 标志。
J
Justin

@svick 发布了一个很好的答案。我想存储我所有的 .java 文件并保持 build.gradle 不变,所以我运行:

git stash push *.java

S
Sairam Gourishetty

在 vs-code 的 Source Control 选项卡中,按住 shift 键,然后选择要存储的文件,然后右键单击并选择 stash changes 选项。