首页 > 解决方案 > 我将一个分支与一个过时的本地主分支合并,然后推送。我该如何撤消?

问题描述

我一直在为一个在 master 之前提交 100 多次的项目开发一个分支。一位同事在过去几天将一些更改推送到 master,而我从未将新更改拉到我的本地环境中。

在我匆忙部署我的工作时,我忘记了先从 origin/master 拉取,我将我的大分支与本地 master 合并并推送到远程存储库。

现在我同事的所有更改都已删除,我似乎无法找到恢复这些更改的方法。

我有什么选择?

标签: git

解决方案


不要惊慌。这一切都可以恢复。

最重要的是,在没有首先了解他们在做什么的情况下,不要再做任何推动。也许等到星期一让你的同事回来。


没有--force. 发生了其他事情。让我们把它画出来。

我一直在为一个在 master 之前提交 100 多次的项目开发一个分支。一位同事在过去几天将一些更改推送到 master,而我从未将新更改拉到我的本地环境中。

我们称之为提前 3 次提交。您的本地仓库看起来像这样。

          [origin/master]
A - B - C [master]
         \
          D - E - F [feature]

遥控器看起来像这样。

A - B - C - G - H - I [master]

在我匆忙部署我的工作时,我忘了先从 origin/master 拉,我将我的大分支与我的本地 master 合并......

合并后,您的仓库将如下所示:

          [origin/master]
A - B - C --------- M [master]
         \         /
          D - E - F [feature]

...并推送到远程存储库。

你不能没有,--force因为你当地的主人和原产地的主人已经分道扬镳了。如果我们在git fetch.

          G - H - I [origin/master]
         /
A - B - C --------- M [master]
         \         /
          D - E - F [feature]

不能通过简单地将提交添加到 origin/master 来应用您的 master。git push不管用。

这里缺少一些东西。可能是这样...

  • 你用过git push --force
  • 你的同事从不推高。
  • ???

无论哪种方式,这都是你解决它的方法。

  1. 让你的同事到git push --force他们的主分支。

这将恢复他们的 master 版本。

  1. 如果您删除了分支,请在合并之前重新创建它。

您将需要它来重做合并。在上面的示例中,这将是git branch feature F.

  1. git fetch

这将更新您的起源想法。origin/master 现在应该在您同事的工作上。

$ git fetch

          G - H - I [origin/master]
         /
A - B - C --------- M [master]
         \         /
          D - E - F [feature]
  1. 结帐大师和git reset --hard origin/master.

这将清除您对 master 的本地更改并将其恢复到 origin/master,从而有效地撤消合并。它只是将您的master标签移动到位置origin/master

$ git checkout master
$ git reset --hard origin/master

                      [origin/master]
A - B - C - G - H - I [master]
         \
          D - E - F [feature]
  1. 重做合并。
$ git merge feature

                    [origin/master]
A - B - C - G - H - I - M [master]
         \             /
          D - E ----- F [feature]
  1. git push.
$ git push

                          [origin/master]
A - B - C - G - H - I - M [master]
         \             /
          D - E ----- F [feature]

一旦这一切都解决了,考虑让 master 成为一个不能直接推送到的受保护分支;对 master 的所有更改都必须经过一个集成步骤,例如拉取或合并请求。GitLabGithub提供受保护的分支。或者它可以用hooks来完成。

这避免了错误,并确保 master 是一个稳定的代码库。


推荐阅读