我怎样才能存储特定文件?

ynk*_*nkr 1422 git 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")
Run Code Online (Sandbox Code Playgroud)

我只想藏匿app/views/cart/welcome.thtml,我该怎么做?有点像(但当然这不起作用):

git stash save welcome_cart app/views/cart/welcome.thtml
Run Code Online (Sandbox Code Playgroud)

svi*_*ick 2183

编辑:从git 2.13开始,有一个命令可以保存存储的特定路径:git stash push <path>.例如:

git stash push -m welcome_cart app/views/cart/welcome.thtml
Run Code Online (Sandbox Code Playgroud)

老答案:

您可以使用git stash --patch(或git stash -p)执行此操作- 您将进入交互模式,在该模式下,您将看到每个已更改的块.使用n跳过你不想藏匿,文件y当你遇到要藏匿之一,q退出并离开unstashed剩余的帅哥. a将隐藏显示的大块和其余的帅哥藏在那个文件中.

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

  • 如果你说'a`而不是`y`它会隐藏那个hunk +文件的其余部分,这要快得多. (119认同)
  • @jeffamaphone很棒!"d"也会相反,即不会在当前文件中隐藏任何更多的东西.确实`?`将显示所有可能的选项. (52认同)
  • @JamesJohnston`git stash --keep-index`将允许您存储所有未分级的更改(与您要查找的相反).http://stackoverflow.com/a/8333163/378253 (46认同)
  • 繁琐,但有效.我希望有一种快速方法可以隐藏暂存的更改,然后在稍后弹出时将更改放入未分级的工作树中. (29认同)
  • 似乎在2.7.4中不起作用 (9认同)
  • 这似乎没有做的唯一事情是包括对二进制文件的更改.我编辑了一些图形,做了git stash --patch方法,它们从未被列出. (6认同)
  • 谢谢![命令](http://git-scm.com/docs/git-stash)我使用的是:`git stash save --patch"Stash message"`,然后我进入[**交互模式**](http://git-scm.com/docs/git-add.html)选择我要藏匿的帅哥.我也可以使用这个命令:`git stash save --patch --no-keep-index"存储消息"`当我已经暂存了我想要存储的文件并且不想在存储后保留它. (6认同)
  • 我想用这个,但给Stash一个名字.参数的顺序非常敏感 - 例如`git stash -p save'name"`和`git stash save"name"-p`都没有工作,但最终发现**`git stash save -p"name"`***做了*工作. (5认同)
  • @Vencovsky它代表“消息”,用于指定隐藏的可选描述。如果不需要的话,可以省略-m welcome_cart部分。 (5认同)
  • v2.13中的编辑正是这个问题所要求的. (3认同)
  • 仅供参考,弹出此隐藏文件的方式与平常相同,git stash pop (3认同)
  • `--patch` **是**用户友好的! (2认同)
  • -u选项还可以存储新的尚未提交的文件 (2认同)
  • `-m` 有什么作用? (2认同)
  • @svick可能值得更新答案以澄清“-m”正在做什么,我(错误地)假设您在那之后列出了不同的文件路径,因此我的路径最终被添加为消息而不是部分藏起来:) (2认同)
  • 这也适用于多个文件:`git stash push -m temp /file/one /file/two /file/ Three` (2认同)

ska*_*lee 301

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

git add app/controllers/cart_controller.php
git stash --keep-index
git reset
Run Code Online (Sandbox Code Playgroud)

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


警告 正如评论中所述,这会将所有内容放入存储中,无论是暂存还是非暂存.在保存完成后,--keep-index只保留索引.以后弹出存储时,这可能会导致合并冲突.

  • 不,这会将所有内容都放入存储中,无论是分阶段还是非分阶段.在保存完成后,`--keep-index`只保留索引.所以这不是AFAICT这个问题的有效答案. (174认同)
  • 警告:记下@拉曼的观点.这不应该做它应该做的事情.这将在存储中进行相同的更改**并将**留在工作树中.当您稍后尝试弹出存储时,您可能会遇到合并冲突,并且它们通常非常容易混淆并且难以修复. (7认同)
  • 如果您不想使用--patch选项进行大量更改,这比接受的答案要好得多. (4认同)
  • 请参阅我对@Rachel的问题的回答,以获取与此相反的解决方案(存储分阶段的更改,而不是未分阶段的更改)-http://stackoverflow.com/questions/3040833/how-to-stash-only-one已更改的多个文件中的文件/ 17137669#17137669 (2认同)
  • 之后,如果你想恢复你保存的文件而不提交你添加的文件,你可以运行`git stash; git stash pop stash @ {1}`. (2认同)
  • @DanBerindei已暂存的文件保留在索引**中,并且已保留在索引中。如果您编辑其中之一并尝试进行隐藏,则经常会发生编辑冲突。如果您放弃对这些文件的更改并取消存储,这些更改将返回-至少那是我上次尝试进行的操作。 (2认同)

Hon*_*ang 275

对于隐藏一个文件:

\n
git stash -- filename.txt\n
Run Code Online (Sandbox Code Playgroud)\n

要在命令中给出消息而不是在提示时输入消息,请在文件部分之前添加 -m,例如git stash -m "stash-message" -- filename1.txt

\n

对于存储多个文件:

\n
git stash -m "stash-message" -- filename1.txt filename2.txt\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n

  • 要隐藏消息,请在文件部分之前添加 `-m`,例如 `git stash -m "your message" -- filename1.txt filename2.txt` (8认同)
  • 这仅适用于跟踪的文件,否则您会收到如下错误:“错误:pathspec 'filename1'与 git 已知的任何文件都不匹配” (4认同)
  • 这对我来说是解决OP问题最快、最简单的解决方案,+1 (2认同)
  • 您还可以通过将未跟踪的文件添加到暂存区域来隐藏它们,例如“git add my.file”,然后“git stash -- my.file”。每当您应用存储更改时,如果您愿意,您都可以取消暂存它们,以便它们再次保持未跟踪状态。 (2认同)
  • @Bower `-` 意味着将我后面的所有内容视为文件名。 (2认同)

qiu*_*qiu 78

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

git stash push [paths you wish to stash]
Run Code Online (Sandbox Code Playgroud)

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

git stash push src/
Run Code Online (Sandbox Code Playgroud)

  • 注意:弹出操作不需要路径,只需“git stash pop”即可。 (5认同)

Aks*_*hay 51

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

  1. 确保您已经在 VSCode 中安装了GitLens扩展
  2. 转到源代码管理选项卡
  3. 选择您想要隐藏的文件
  4. 右键点击它,你会看到很多选项。单击“隐藏更改”

在此输入图像描述

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

在此输入图像描述

  • @SomeoneSomewhere 尝试使用 GitLens 扩展 (5认同)
  • 对于许多 vscode 用户来说这是一个很好的解决方案,无需摆弄命令 (3认同)

Vic*_*y P 23

简短而简单的解决方案:

git stash -- filename.ext
Run Code Online (Sandbox Code Playgroud)

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

  • 什么版本的 git 支持这个?我用的是2.1.4,不支持。 (2认同)

Omk*_*war 13

  • git status (确保您的更改可以隐藏)

src/config/bl.go

src/config/dl.go

如果你只想存储 dl.go

  • git stash push -m "< 输入您的消息,例如:恢复的 dl 文件> " src/config/dl.go

显示您的藏匿清单

  • git 存储列表

然后检查您的分支机构并应用隐藏

  • git stash 应用存储{0}


geo*_*sey 7

如果您可以使用 GIT GUI 客户端,那么自 2020 年 5 月起,Fork可以非常无缝地完成此操作。部分存储功能的 GIF 将比任何文字更好地展示这一点:git-fork 中部分存储功能的 GIF

请注意,Fork(这对 Google 来说是一个很难取的名字!)不是免费软件,评估期后的费用为 50 美元,但您可以像对待 WinRAR 或 WinZip 一样忽略弹出窗口。


小智 5

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

git stash push *.java
Run Code Online (Sandbox Code Playgroud)


Omi*_*mid 5

由于 git,2.35.0您可以使用标志来存储分阶段的更改--staged | -S

例如:

git stash --staged
Run Code Online (Sandbox Code Playgroud)

——上演的

该选项仅对推送和保存命令有效。

仅存储当前正在进行的更改。这与基本的 git commit 类似,只是状态被提交到存储而不是当前分支。

--patch 选项优先于该选项。

https://git-scm.com/docs/git-stash/2.35.0#Documentation/git-stash.txt---暂存

这个新功能的好处在于,不仅可以存储特定的未跟踪文件,还可以存储跟踪文件中代码更改的特定部分;当您使用--patch | -p标志将它们添加到舞台时。