撤消已推送到原点的不良合并

Undo bad merge already pushed to origin

情况如下:

我有一个开发分支和一个功能分支,当完成功能时我想将它合并到开发中。冲突出现了,我首先将 develop 拉入功能来解决它​​然后提交修改但是:

我只提交解决了冲突的文件,其余的忘记了。因此,当我将功能合并到开发中时,它会回滚大量提交...

origin develop>  ----o-c-c-c-o-------m------
                      \       \     /
 local feature>        f-------m-r-o

提交 'c' 与功能合并,但是当再次与开发合并时我忘记了它们。

我该如何解决这个问题?

编辑:

我对 git 的实验不是很深入,所以我要求的答案比一般的 git reset 更能针对我的问题回应

你做了一个错误的合并。

origin develop>  ----o1-c1-c2-c3-o2---------m2------
                      \           \        /
 local feature>        f1----------m1-r1-o3

你的错误是在提交 m1 中,并且更改在链中传播得更远。

改写历史

解决这个问题的最干净的方法是重写历史,这样一切仍然正常。但是,这会破坏每个人的历史记录,因此他们需要将他们的分支重置为新的头,仅当您在推送之前发现错误时才推荐。

修复是重做合并,然后重做与主服务器的最终合并。

  1. on branch: feature: git reset --hard f1

    我们将回到提交时的分支状态 f1

  2. on branch: feature: git merge o2

    重做我们的合并,确保这次我们没有丢弃我们的索引

  3. on branch: feature: git cherry-pick r1

    包括提交中引入的更改 r1

  4. on branch: feature: git cherry-pick o3

    包括提交中引入的更改 o3

  5. on branch: feature: git push -f

    强制推送我们的固定功能分支

  6. on branch: feature: git checkout develop

    切换到开发,以便我们修复它

  7. on branch: develop: git reset --hard o2

    我们将回到提交时的分支状态 o2

  8. on branch: develop: git merge feature

    重做主分支合并的功能,这修复了整个链。

  9. on branch: develop: git push -f

    强制推送我们的固定开发分支。

由于您已经推送,最安全的做法(在 develop 上)是挑选丢失的提交。对于每个提交 C,运行 git cherry-pick C.