如何在Git中向存储区添加更多的修改

34
假设我已经存储了一些更改,并且我想将进一步的更改添加到同一个存储中(例如stash@{0})。有没有简单的方法可以做到这一点?把两个存储合并成一个怎么样?
假设您已经存储了一些更改,现在想要将其他更改添加到相同的存储区(如stash@{0})中,是否有简便方式?另外,如何将两个存储区合并为一个?

什么阻止你只是恢复存储,修改它,然后再次存储。如果您想要合并两个存储,只需获取它们并再次存储即可。 - Leif Andersen
1
@LeifAndersen:当你有进一步的更改,但不想将其添加到存储区时,这是一种痛苦。 - Casebash
先将您不想要的更改藏在那里吗? - Leif Andersen
4个回答

23

我认为我们不必遵循所有这些步骤,

git stash pop [这将应用您上一次存储的更改stash{@0}] 然后再次执行 git stash [这将创建新的存储与所有更改到stash@{0}]


1
我不确定为什么有人会对这个答案进行负投票,因为它似乎是有效的...至少在大多数情况下 :) - Maciek Talaska
简单胜于复杂。https://www.python.org/dev/peps/pep-0020/#id2 - Osama Dar
这并不是OP的问题所在。假设我已经更改了文件A和文件B,然后将文件A存储到存储0中。然后我继续处理文件A,使其成为A'。然后我想将文件B存储到原始文件A旁边。我不希望取消存储,从而将A合并到A'中。这是一组不同的操作。https://dev59.com/d2sz5IYBdhLWcg3wNE5q#8060523 对于OP所询问的机制有正确的解释。 - Holy

19

我没有看到任何 "git stash" 选项可以修改现有的 git stash。

一种可能的方法是:

  • 把你额外的更改存储起来 (stash@{1})
  • 存储其他所有内容 (stash@{2})
  • 从你当前修改的提交 (HEAD) 创建一个 tmp 分支
  • git stash pop 两次
  • git stash,创建一个包含两个内容的新的 stash@{1}
  • 删除临时分支并切换回最初的分支
  • git stash pop 一次 (以恢复所有待处理的更改)
  • 继续你的选择性保存

五年后,Powerslave评论中提出:

分支魔术是完全不必要的。
你可以简单地:

  1. 创建一个新的 stash ,其中包含你所拥有的所有更改。
  2. git stash apply 两个更改集合(如果你使用 pop,但如果你意外地出错了,那么就会有麻烦)
  3. 创建一个新的 stash ,其中包含这些合并的更改。
  4. 如果你使用apply而不是pop,就git stash drop 另外两个更改集合

如果你需要一些想法,可以考虑使用TortoiseHg Workbench的Shelve工具。它的工作流程非常适合这种问题:从你的工作副本中创建货架,并根据需要向其中添加或删除内容,甚至在不同的货架之间进行操作。 - Andre Luus
5
我认为这太过复杂了。完全没有必要使用分支魔法。你可以简单地:1. 使用现有内容创建一个新的存储。2. git stash apply 两个变更集(你也可以使用 git stash pop,但如果你不小心搞砸了,那就麻烦了)。3. 创建一个包含这些合并变更的新存储。4. 如果你使用了 apply 而不是 pop,则删除另外两个变更集的存储。 - Powerslave
@Powerslave 很好。我想我五年前没有想到这一点。我已经将您的评论包含在答案中,以增加可见性。 - VonC
@VonC 不过还是谢谢你的回答! 我想知道是否有便捷的方法,你指出了我想知道的。忘记点赞了,抱歉,我现在会关注这个问题。 - Powerslave
@TimBoland 最好提出一个带有具体细节的新问题,以查看您为什么会收到该消息。 - VonC
显示剩余2条评论

2
你不能往旧的存储中添加新的更改,但你可以将当前的更改和旧的存储合并创建一个新的存储。以下是如何操作:
1. 创建初始存储:
git stash save -u "initial stash"

在你的代码库中进行进一步的更改,将你想要添加到初始存储中的内容加入进去。
3. 将所有更改进行暂存:
git add .

列出您的存储库中所有可用的隐藏文件夹:
git stash list

你会看到类似这样的输出: stash@{0}: 在主分支上:初始存储
将您的初始存储应用于您的额外更改之上:
git stash apply stash@{0}

(可选步骤)使用您的集成开发环境解决可能在您的初始存储和当前更改之间出现的任何冲突。
创建一个新的存储区,将您最初的存储区更改和最近的更改合并在一起:
git stash save -u "initial stash combined with new changes"

8. 使用您的综合储备:
git stash apply stash@{0}

删除您的初始存储:
git stash drop 1

你将会看到如下输出:Dropped refs/stash@{1}
通过按照以下步骤进行操作,你可以将初始存储与新的修改有效地结合起来,并继续你的工作。

1

这是一个老问题,但我觉得它仍然缺少正确的答案:不要使用git stash, 而是使用临时提交和/或临时分支

假设我已经隐藏了一些更改,并且我想将进一步的更改添加到同一个隐藏中(例如stash@{0})。有没有简单的方法可以做到这一点?

是的,当您使用普通的、简单的提交时,这只是一个带有edit操作的普通交互式变基。

那么将两个隐藏组合成一个隐藏呢?

当您使用普通的、简单的提交时,这只是一个带有fixup操作的普通交互式变基。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接