【问题标题】:How can I git stash a specific file?我怎样才能 git stash 一个特定的文件?
【发布时间】:2011-07-27 06:05:37
【问题描述】:

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

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

标签: git git-stash


【解决方案1】:

编辑: 从 git 2.13 开始,有一个命令可以将特定路径保存到 stash:git stash push &lt;path&gt;。例如:

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 部分省略。
【解决方案2】:

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

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

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


警告 如 cmets 中所述,git stash --keep-index 将所有内容推送到存储区,包括已暂存和未暂存。 --keep-index 在存储完成后只留下索引。当您稍后弹出存储时,这可能会导致合并冲突。

【讨论】:

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

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

git stash push [paths you wish to stash]

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

git stash push src/

【讨论】:

  • 注意:弹出没有路径,只是git stash pop
【解决方案4】:

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

  1. 转到源代码管理选项卡
  2. 选择要隐藏的文件
  3. 右击它,你会看到很多选项。点击存储更改

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

【讨论】:

  • 我的显示:丢弃更改,阶段更改,添加到 gitignore。不藏匿
  • @SomeoneSomewhere 尝试使用 GitLens 扩展
  • 对很多vscode用户来说很好的解决方案,不需要摆弄命令
【解决方案5】:

用于存储一个文件:

git stash -- filename.txt

用于存储多个文件:

git stash -- filename1.txt filename2.txt

【讨论】:

    【解决方案6】:

    如果您可以使用 GIT GUI 客户端,Fork 可以在 2020 年 5 月之前完美无缝地执行此操作。部分存储功能的 GIF 比任何文字都更能显示这一点:

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

    【讨论】:

      【解决方案7】:

      短而简单的解决方案:

      git stash -- finename.ext
      

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

      【讨论】:

      • 什么版本的git支持这个?我用的是 2.1.4,不支持。
      • 嗨 @JellicleCat 我正在使用 2.31.1
      猜你喜欢
      • 2017-05-13
      • 1970-01-01
      • 2017-03-29
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      相关资源
      最近更新 更多