【问题标题】:Stash just a single file仅存储一个文件
【发布时间】:2012-09-07 09:45:20
【问题描述】:

我希望能够仅存储单个文件中的更改:

git stash save -- just_my_file.txt

上述方法不起作用。有其他选择吗?

【问题讨论】:

  • 对于 single 文件,而不是杂耍 stash 命令,更简单的方法是复制 single 文件,当你想把它带回简单复制原件。例如。 cp just_my_file.txt just_my_file.txt.manualstash 现在您可以进行所有检查和操作,并且由于副本是“未跟踪文件”,您可以跨分支和提交移动而不会出现任何问题。当您在要“合并 single 文件”的正确分支/提交上时,只需执行 mv just_my_file.txt.manualstash just_my_file.txt,现在您可以查看更改并在必要时提交
  • @DimitryK 同时不要执行git clean -f -d,因为它会删除未跟踪的文件。 :-)

标签: git git-stash


【解决方案1】:

如果您不想在隐藏的更改中指定消息,请在双破折号后传递文件名。

$ git stash -- filename.ext

如果它是未跟踪的/新文件,您必须先暂存它。

但是,如果您确实想要指定消息,请使用push

git stash push -m "describe changes to filename.ext" filename.ext

这两种方法都适用于 git 版本 2.13+

【讨论】:

  • 在进行修改时,这个答案对我来说似乎是最直接的:git stash -- filename.extgit commit --amendgit stash pop
  • 我认为这必须依赖于一些非常新的功能。它在 git 2.1.4 中不起作用。
  • 2.24.3 (Apple Git-128)一起工作
  • git stash push 不存在。
  • 不工作 2.7.1
【解决方案2】:

以防万一您在使用“git stash”时实际上是指“放弃更改”(并且不要真正使用 git stash 临时存储它),在这种情况下您可以使用

git checkout -- <file>

请注意,git stash 只是分支和执行操作的一种更快捷、更简单的替代方法。

【讨论】:

  • 如果您想删除对单个文件的所有修改更改,我认为这是最好的答案。
  • 我希望这是该特定任务的最佳答案
  • 问题已经很清楚了,并没有问如何将更改还原到一个文件。投反对票。
  • @MukulJain 我实际上需要以非常临时的方式使用每个文件的存储(基本上将影响同一行的两个提交中的一些更改分开,用于一个文件)。我实际上不会投反对票,只是说这对我没用。
【解决方案3】:

我认为stash -p 可能是您想要的选择,但以防您将来遇到其他更棘手的事情,请记住:

Stash 实际上只是一个非常简单的替代方案,可以替代稍微复杂一点的branch 集合。 Stash 对于快速移动事情非常有用,但您可以使用分支完成更复杂的事情,而不会带来更多的麻烦和工作。

# git checkout -b tmpbranch
# git add the_file
# git commit -m "stashing the_file"
# git checkout master

去做你想做的事,然后只需rebase 和/或merge tmpbranch。当您需要进行比 stash 允许的更仔细的跟踪时, 确实没有太多额外的工作。

【讨论】:

  • 从好的方面来说,您可以将藏匿处变成真正的分支,而不会带来巨大的痛苦。
  • 将其与来自 master 的 git checkout tmpbranch the_file 混合使用,这对于将单文件更改拉回 master 分支非常有用。见stackoverflow.com/a/307872/4692594
  • 感谢您使用评论前缀。我希望更多人在发布命令时这样做。
  • 放评论前缀有什么好处?
  • 更明确地说:它们不是 cmets,它们是命令提示符(就像下面答案中的 $ down)。两者都是常规使用,但有时$ 表示普通用户,# 表示 root/admin。
【解决方案4】:

最好的选择是暂存除此文件之外的所有内容,并告诉 stash 将索引保留为 git stash save --keep-index,从而暂存您未暂存的文件:

$ git add .
$ git reset thefiletostash
$ git stash save --keep-index

正如 Dan 指出的那样,thefiletostash 是唯一一个被隐藏重置的文件,但它也隐藏了其他文件,所以它并不是你想要的。

【讨论】:

  • 虽然这使索引保持在相同的状态,但这不也隐藏了索引中的文件吗?换句话说,如果这样做之后你将索引提交到当前分支,然后切换到另一个分支并执行git stash pop,它不会应用所有文件,而不仅仅是我们想要存储的一个文件?
  • @DanMoulding:你说的很对,我还没想过这个。
【解决方案5】:

您可以使用git stash -p(类似于git add -p)交互式地存储单行。

它不需要文件名,但是您可以使用 d 跳过其他文件,直到您到达要存储的文件,然后使用 a存储所有更改>。

【讨论】:

  • 如果您有很多不想存储的文件,这将需要很长时间。
  • 我不知道这是什么时候改变的,但从git 2.14.1开始,您可以指定文件名git stash -p &lt;filename&gt;
  • 不工作 2.7.1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 2011-11-24
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多