从git中还原合并和历史“撤销”

我们团队的正常流程是将我们的功能分支合并到QA分支中,测试该分支,然后将我们的功能分支移到Master中。 团队中的某个人正在遵循正常的流程,但在QA之后他并没有将他的分支合并到Master中,而是将所有QA合并到了Master中。 这把我们的主要分支搞砸了,因为其他开发商没有做过的项目进入了分支机构。

合并是从gitLab的界面完成的,而不是终端。 我们想要做的是完全恢复这个合并和所有102次提交。 恢复后我们不希望有任何历史记录。 在我们的遥控器上执行此操作的最佳方式是什么? 我已经看到人们提到使用-m和git还原,但是如果我正确理解它会扰乱历史。 合并是否没有真正的“撤销”? 我们在这里有点绝望。 谢谢!


您可以重置master ,例如

        master
          |
          V
o--o---o--o
          /
         /       
o---o---o
        ^
        |
       qa_branch

如果你的仓库看起来像这样,你可以做

$ git checkout master
$ git reset --hard HEAD^

HEAD^是用于第一父提交的快捷方式HEAD 。 你也可以使用HEAD^1

在你做完这个之后你的仓库看起来像

     master
       |
       V
o--o---o


o---o---o
        ^
        |
       qa_branch

警告

现在您必须强制推送来覆盖origin/master 。 在这种情况下,您必须确保没有其他开发者在此期间在origin/master上推送更改。 否则,这些更改将会丢失。

以这种方式强制推送

$ git push -f origin master

我相信最好的解决方案是从master分支的最后一个优点(例如tmp-master )创建一个新分支,然后完全删除主分支。 一旦它消失了,你可以从你的tmp-master分支的头部创建一个新的master 。 当然,你需要强制新的主分支到原点,并让所有其他人拿着一个主副本再次把它拉下来。

我相信这些命令应该是:

git checkout master
git checkout <sha of last good commit>
git checkout -b tmp-master
git branch -d master
git checkout -b master
git push -f origin master

那么,在每个拥有master分支的机器上:

git checkout master
git pull

对于类似(但略有不同)的方法,请查看:这个问题


恢复后我们不希望有任何历史记录。

在这种情况下,这可能是GitLab的WONTFIX,因为它们通常反对来自Web UI的历史更改。 例如http://feedback.gitlab.com/forums/176466-general/suggestions/5590144-allow-git-reset-hard-from-web-interface:

您不应该重置远程仓库上的分支机构。

所以你可能不得不求助于可以在其他答案中找到的非GitLab Git方法,以及许多其他Git问题。

链接地址: http://www.djcxy.com/p/15829.html

上一篇: Revert Merge and history "undo" from git

下一篇: Sourcetree/git to not show closed remote branches