如何仅应用git中的一些存储?

42

我想将git stash中的一些更改应用于一个提交,将其余更改应用于另一个提交。


1
你说的“一半”是什么意思?是每个藏品的一半,还是整个藏品清单的一半? - Fatih Arslan
1
你是不是指的是“一半”就是“一部分”的意思? - bitmask
4个回答

63
git checkout stash@{0} -- <filename>

您也可以使用列表或文件名的通配符来执行此操作。


4
如果存储是从早期提交中创建的,则结账错误。 - Nikolai
虽然这个方法可以解决问题,但它会用储藏中的版本覆盖掉 <filename> 。如果文件已经漂移,你需要手动解决无关的合并冲突,就像 @nikolai 所指出的那样。 - Matt Kneiser

26

看起来你可以使用 git checkout -p 命令与一个储藏的引用一起使用,比如 stash@{0}。这样可让你逐个选择从储藏中应用到你的工作树中的内容。

当你完成使用 git checkout -p 命令后,你所接受的更改将已经被应用到你的工作树中并添加到缓存/索引中,准备提交。你可以多次使用 git checkout -p stash@{0} 命令,在沿途选择你想要的补丁并进行任意次数的提交。


1
这正是我所需要的,我认为其他答案会丢弃后续提交和/或工作树中的更改。请注意,同时传递路径非常有用,特别是如果您的分支自存储以来已经被重新设置。这有助于避免手动过滤干扰性更改(对于您不需要恢复的其他路径),因为重新设置。 - Nick Treleaven

12

只针对您想要更改的文件应用修补程序。

git show --first-parent stash@{0} -- <file(s) in question> | git apply

3
我认为默认输出已更改,现在需要指定“-m”选项(git show -m stash...)才能输出一个git apply可以理解的差异。如果没有这个选项,git apply会产生“错误:无法识别的输入”。 - Andrew France
@AndrewFrance 我找不到太多关于“-m”的参考资料。你能指向一些文档,我会更新我的答案。 - Mort
文档似乎不够充分,-mgit-show 的 man 页面的选项列表中并不存在,但在 combined diff format 部分简要提到了它。对我来说,为什么它有效并不清楚,抱歉! - Andrew France
我认为-m是用于git stash show命令的(具有与git diff相同的选项),而不是用于git show stash命令。 - user2543253
2
@Cilyan 我已经重现了这个 bug。现在,保留的快照似乎被保存为合并提交,并生成“合并差异”。如果我在 show 命令中添加 --first-parent ,它就能正常工作了。回答已更新。 - Mort
显示剩余3条评论

6
解除存储库藏匿...
git stash pop

...在补丁模式下使用git add...

git add -p

...然后提交该更改...

git commit -m "Partial stashed commit"

在没有阅读文档的情况下,这是我脑海中迅速想到的。Leo的答案有更好的方法来实现此目的。


3
你可以重新存储未提交的更改,但保留索引。 - Roman
是的。@R0MANARMY 提供了一个好办法。使用 git stash --keep-index 来实现这一点。 - acjay
在这之后,我意识到我想要遵循Dmitry的答案,因为我想把我的不想要的更改仍然存储,但是我的待提交更改同时存在于工作目录和索引/缓存/阶段中,以便在提交之前进行测试。 - Josiah Yoder

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