git - 我将一个分支与一个过时的本地主分支合并,然后推送。我该如何撤消?
问题描述
我一直在为一个在 master 之前提交 100 多次的项目开发一个分支。一位同事在过去几天将一些更改推送到 master,而我从未将新更改拉到我的本地环境中。
在我匆忙部署我的工作时,我忘记了先从 origin/master 拉取,我将我的大分支与本地 master 合并并推送到远程存储库。
现在我同事的所有更改都已删除,我似乎无法找到恢复这些更改的方法。
我有什么选择?
解决方案
不要惊慌。这一切都可以恢复。
最重要的是,在没有首先了解他们在做什么的情况下,不要再做任何推动。也许等到星期一让你的同事回来。
没有--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
。 - 你的同事从不推高。
- ???
无论哪种方式,这都是你解决它的方法。
- 让你的同事到
git push --force
他们的主分支。
这将恢复他们的 master 版本。
- 如果您删除了分支,请在合并之前重新创建它。
您将需要它来重做合并。在上面的示例中,这将是git branch feature F
.
git fetch
这将更新您的起源想法。origin/master 现在应该在您同事的工作上。
$ git fetch
G - H - I [origin/master]
/
A - B - C --------- M [master]
\ /
D - E - F [feature]
- 结帐大师和
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]
- 重做合并。
$ git merge feature
[origin/master]
A - B - C - G - H - I - M [master]
\ /
D - E ----- F [feature]
git push
.
$ git push
[origin/master]
A - B - C - G - H - I - M [master]
\ /
D - E ----- F [feature]
一旦这一切都解决了,考虑让 master 成为一个不能直接推送到的受保护分支;对 master 的所有更改都必须经过一个集成步骤,例如拉取或合并请求。GitLab和Github提供受保护的分支。或者它可以用hooks来完成。
这避免了错误,并确保 master 是一个稳定的代码库。
推荐阅读
- typescript - 如何在运行时在 Vue 上设置全局数据?
- php - Woocommerce - 是否可以根据该类别下产品的库存状态隐藏产品类别?
- r - Highcharter-R:x 轴值未显示,y 轴上的文本错误
- docusignapi - 如何在docusign android sdk的构建方法中提供文件uri
- javascript - 使用 React Context 改变 progressBar 的状态
- angular - 如何使 webos lg tv webbrowser 支持 angular webapp?
- spring - 带有占位符的 Springboot 应用程序属性,在应用程序内部动态更新
- google-cloud-bigtable - Bigtable from_service_account_json() 不工作
- laravel - 如何使用带有 url 参数和错误消息的 auth 中间件的 redirectTo 方法?
- javascript - HTML5 视频:跳转到特定帧而不是时间位置?或者将暂停的视频步进到下一帧或上一帧?