还原分割提交

时间:2017-04-20 16:53:27

标签: git

我必须在不同的提交之间(推送)恢复多个提交(推送)。实际上发生的事情是在一个项目上工作时我总是git pull而不是git pull --rebase,所以我的提交在另一个人的提交之间进行,我也推了它。现在我想从分支中恢复我的中间(推送)提交。

例如:

A-B-C-D-E-F-G-H

我想恢复CEG而不影响剩余的提交。

有没有办法考虑我在修复此问题时无法删除当前分支?

2 个答案:

答案 0 :(得分:0)

选项1

这应该做的工作:

git revert <commit-hash-of-G>
git revert <commit-hash-of-E>
git revert <commit-hash-of-C>

唯一的缺点是,这将创建新的提交。 这是一种方法,如果您已共享分支(已推送到远程)

选项2

否则,您可以使用@ 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

我对您的问题的解读是,您要从历史记录中删除CEG(可能是为了通过功能分支重新引入这些更改,或者压扁提交,或其他方式)。

因为一切都被推了,所以没有好的&#34;这样做的方法。对历史记录的任何更改都将要求拥有repo克隆的每个人执行恢复过程。 git rebase文档在讨论&#34;从上游rebase&#34;中恢复时会解释这一点,但它适用于任何操作,该操作可以从远程ref和使它&#34;不再可达&#34;来自远程参考。

另一种说法是,您不能从历史记录中删除提交,同时保留其余提交不受干扰。删除后的提交将具有新的父级和更改的树,使其成为新的提交(具有新ID)。因此,传递上,此后每一个都会在分支中提交。

既然如此,如果你要改变历史,有很多方法可以做到。挑选樱桃的方法还可以。你可以做一个交互式的rebase(可能更简单)来删除C,E和G(或者将它们移到最后并压缩它们,如果那是你之后的事情)......虽然这不是&和#39;让他们进入一个单独的分支而不会跳过一些额外的箍,所以如果那是你所追求的,那么也许不是最好的方法。