在Git中重新进行合并
我在这里遇到了一些问题:我在Git中有一个特定于问题的分支28s
,我在一般的develop
分支中合并。 原来我做得太快了,所以我用git-revert来撤销合并。 然而,现在合并28s
开始develop
的时候到了,但合并指挥看到了原来的合并,高兴地宣布一切正常,分支已经合并了。 现在我该怎么做? 创build“还原”还原“28s – >开发”“'提交? 似乎不是一个好办法,但目前我无法想象任何其他方法。
什么树结构看起来像:
你必须“恢复回复”。 取决于你是如何回复的,可能并不像听起来那么容易。 看看这个话题的官方文件 。
---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
。 然后我删除了我不想要的分支。 当然,这只有在你能够把你搞砸的分支扔掉的时候才有用。