我一直在为一个项目的分支工作,这个项目是100+在master之前提交的。在过去的几天里,一位同事将一些更改推给了大师,而我从未将新的更改应用到我的本地环境中。
在我急于部署我的工作时,我忘记了首先从源/主服务器拉入,我将我的大分支与我的本地主服务器合并并推送到远程存储库。
现在我同事的所有更改都被删除了,而我似乎找不到恢复这些更改的方法。
我有什么选择?
发布于 2020-09-19 02:37:50
不要惊慌。它们都可以恢复。
最重要的是,在没有确切了解它们在做什么的情况下,不要再对进行任何推送。也许可以等到周一你的同事们回来。
如果没有--force
,您就不应该能够进行推送。发生了一些其他的事情。让我们用图表来解决这个问题。
我一直在为一个项目的分支工作,这个项目是100+在master之前提交的。在过去的几天里,一位同事将一些更改推给了大师,而我从未将新的更改应用到我的本地环境中。
让我们称之为提前3次提交。您的本地repo如下所示。
[origin/master]
A - B - C [master]
\
D - E - F [feature]
遥控器看起来像这样。
A - B - C - G - H - I [master]
在我匆忙部署我的工作时,我忘记了首先从源/主节点拉取,并且我将我的大分支与我的本地主节点合并...
在合并之后,您的repo将如下所示:
[origin/master]
A - B - C --------- M [master]
\ /
D - E - F [feature]
...and已推送到远程存储库。
你不能没有--force
,因为你的本地主机和原始主机已经有了分歧。如果我们在git fetch
之后查看您的回购,它将变得更加清晰。
G - H - I [origin/master]
/
A - B - C --------- M [master]
\ /
D - E - F [feature]
您的master不能通过简单地添加提交到simply /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的更改,并将其恢复到源/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是一个稳定的代码库。
https://stackoverflow.com/questions/63964533
复制相似问题