在Git中重新进行合并

我在这里遇到了一些问题:我在Git中有一个特定于问题的分支28s ,我在一般的develop分支中合并。 原来我做得太快了,所以我用git-revert来撤销合并。 然而,现在合并28s开始develop的时候到了,但合并指挥看到了原来的合并,高兴地宣布一切正常,分支已经合并了。 现在我该怎么做? 创build“还原”还原“28s – >开发”“'提交? 似乎不是一个好办法,但目前我无法想象任何其他方法。

什么树结构看起来像:

Git日志输出

你必须“恢复回复”。 取决于你是如何回复的,可能并不像听起来那么容易。 看看这个话题的官方文件 。

 ---o---o---o---M---x---x---W---x---Y / ---A---B-------------------C---D 

允许:

 ---o---o---o---M---x---x-------x-------* / / ---A---B-------------------C---D 

但是这一切工作? 当然是的。 你可以恢复合并,从纯粹的技术angular度来看,git做得很自然,没有真正的麻烦。
它只是把它从“合并之前的状态”改为“合并之后的状态”,就是这样。
没有什么复杂的,没有什么奇怪的,没有什么危险 Git会做甚至没有考虑到它。

所以从技术的angular度来看,恢复合并没有任何问题,但从工作stream的angular度来看,这是你通常应该尽量避免的

如果可能的话,例如,如果你发现一个合并到主树中的问题, 而不是恢复合并, 那么很难

  • 把问题分解成你合并的分支,并修复它,
  • 或者尝试恢复导致它的个人提交。

是的,这是更复杂的,不,它并不总是工作(有时答案是:“哎呀,我真的不应该合并它,因为它还没有准备好,我真的需要撤消所有的合并”)。 那么你真的应该恢复合并,但是当你想重新合并时,你现在需要通过恢复恢复来完成。

假设你有这样的历史

 ---o---o---o---M---W---x-------x-------* / ---A---B 

如果A,B失败了,W是M的还原

所以在我开始修复发现的问题之前,我会selectW提交给我的分支

 git cherry-pick -x W 

然后我恢复W在我的分支提交

 git revert W 

我可以继续修复。

最终的历史可能如下所示:

 ---o---o---o---M---W---x-------x-------* / / ---A---B---W---W`----------C---D 

当我发送一个PR时,它将清楚地显示PR撤销撤销并添加一些新的提交。

而不是使用git-revert你可以在devel分支中使用这个命令来抛出 (撤消)错误的合并提交(而不是仅仅恢复它)。

 git checkout devel git reset --hard COMMIT_BEFORE_WRONG_MERGE 

这也将相应地调整工作目录的内容。 小心

  • 将你的改变保存在开发分支(因为错误的合并),因为它们也会被git-reset删除。 所有提交之后你指定的git reset参数将会消失!
  • 另外,如果您的更改已从其他存储库中取出,则不要执行此操作,因为重置将会重写历史logging。

我build议在尝试之前仔细研究git-reset手册页。

现在,在重置之后,您可以在devel重新应用您的更改,然后执行

 git checkout devel git merge 28s 

这将是一个从28s到真正的合并,像最初的一个(现在从git的历史中删除)。

要恢复回复,而不是过多地搞乱你的工作stream程:

  • 创build开发的本地垃圾副本
  • 恢复开发的本地副本上的恢复提交
  • 将该副本合并到您的function分支,并将您的function分支推送到您的git服务器。

当你准备好了的时候,你的function分支应该能够正常地被合并。 唯一的缺点是你会在你的历史中有一些额外的合并/还原提交。

当我遇到同样的问题时,我刚刚发现这个post。 我发现上面的wayyy可怕的做重置困难等,我最终会删除我不想要的东西,将无法得到它回来。

相反,我检查了我想要分支回去的提交,例如git checkout 123466t7632723 。 然后转换成分支git checkout my-new-branch 。 然后我删除了我不想要的分支。 当然,这只有在你能够把你搞砸的分支扔掉的时候才有用。