我必须在不同的提交之间(推送)恢复多个提交(推送)。实际上发生的事情是在一个项目上工作时我总是git pull
而不是git pull --rebase
,所以我的提交在另一个人的提交之间进行,我也推了它。现在我想从分支中恢复我的中间(推送)提交。
例如:
A-B-C-D-E-F-G-H
我想恢复C
,E
和G
而不影响剩余的提交。
有没有办法考虑我在修复此问题时无法删除当前分支?
答案 0 :(得分:0)
这应该做的工作:
git revert <commit-hash-of-G>
git revert <commit-hash-of-E>
git revert <commit-hash-of-C>
唯一的缺点是,这将创建新的提交。 这是一种方法,如果您已共享分支(已推送到远程)。
否则,您可以使用@ Edmundo的建议:
通过
git checkout <commit-hash-of-A>
git checkout -b repaired-branch
通过
git cherry-pick <commit-hash-of-B>
git cherry-pick <commit-hash-of-D>
git cherry-pick <commit-hash-of-F>
git cherry-pick <commit-hash-of-G>
答案 1 :(得分:0)
其他答案为您提供了良好的基本信息,但应填写一些细节:
首先,你说&#34;恢复提交&#34;,(特别是在git中)只是意味着&#34;使当前状态看起来没有提交&#34;。 git revert
命令不会更改历史记录,因此您可以在日志中看到(最新到最旧)
Revert C
Revert E
Revert G
H
G
F
E
D
C
B
A
我对您的问题的解读是,您要从历史记录中删除C
,E
和G
(可能是为了通过功能分支重新引入这些更改,或者压扁提交,或其他方式)。
因为一切都被推了,所以没有好的&#34;这样做的方法。对历史记录的任何更改都将要求拥有repo克隆的每个人执行恢复过程。 git rebase
文档在讨论&#34;从上游rebase&#34;中恢复时会解释这一点,但它适用于任何操作,该操作可以从远程ref和使它&#34;不再可达&#34;来自远程参考。
另一种说法是,您不能从历史记录中删除提交,同时保留其余提交不受干扰。删除后的提交将具有新的父级和更改的树,使其成为新的提交(具有新ID)。因此,传递上,此后每一个都会在分支中提交。
既然如此,如果你要改变历史,有很多方法可以做到。挑选樱桃的方法还可以。你可以做一个交互式的rebase(可能更简单)来删除C,E和G(或者将它们移到最后并压缩它们,如果那是你之后的事情)......虽然这不是&和#39;让他们进入一个单独的分支而不会跳过一些额外的箍,所以如果那是你所追求的,那么也许不是最好的方法。