其中一个团队提交了一个提交并推送到远程,我们所有人,包括服务器都提取了最新版本。
但是现在它打破了应用程序的重要部分。所以我们:
git reset HEAD^ --hard
git push origin -f
推送后的消息是:
Total 0 (delta 0), reused 0 (delta 0)...forced update
然后我用:
拉了服务器git pull
它说的信息是:
Already up-to-date
所以它还没有恢复到之前提交之前的那个。在我的本地版本上它在正确的提交但在服务器上它仍然是旧的。
主(中央)仓库是github上的仓库,然后是服务器版本,然后是我的本地。
答案 0 :(得分:4)
您永远不应该重写历史来修复错误。相反,revert
破坏提交:
git revert HEAD
git push origin master
通过这种方式你可以通过前进来撤消过去的变化。
要修复服务器,您需要reset
到远程分支:
git fetch origin
git reset --hard origin/master
其中origin
是您服务器上的远程名称,master
是您正在处理的分支。
这会使master
分支在master
上与origin
分支处于同一状态。
后台:pull
尝试将merge
遥控器的相应分支转换为本地分支。由于遥控器上的分支比本地分支“更短”,因此无法合并,merge
只会说“好吧,我完成了,两个分支都是最新的”。
答案 1 :(得分:1)
这是你正在做的事情,以图片形式。
由于“错误提交”推送,在origin
(大概是github)上你有一些提交,如下所示:
... - B - C
\
X <-- HEAD=master
其中X
是“错误”提交。然后,您已经同时获得了自己的repo和服务器的repo,因此它们具有相同的提交序列。 (我在序列中用这个有趣的弯曲画了它,以便下面的图表更有意义。)
现在在您自己的系统中,在您的回购中,您“回放”HEAD
分支(大概是master
,但这适用于即使它是其他分支)一个提交:
... - B - C <-- HEAD=master
\
X
请注意,提交X
仍然存在(在reflog历史记录中,在github和服务器上),此时只是在你的 repo中,master
指向提前提交C
。
现在当你git push origin
被拒绝时,因为它不是快进,所以你使用了-f
。这使得origin
站点也重新点master
,因此提交X
正悬空在空间中(无论是垃圾收集取决于配置;可推送服务器可能会也可能不会保留reflogs。)
然而,在服务器上,“坏”提交仍然存在:
... - B - C
\
X <-- HEAD=master
当你去那里做git pull
时,如果有任何提交,它会git fetch
选择新的提交,然后它会git merge
合并这些新的提交
没有新的提交,因此pull
不会添加任何提交并且不会合并任何内容......这会使master
指向提交X
。就服务器所知,有人在服务器上添加了新的提交X
,它应该挂在它上面,因为也许任何添加它的人都会把它推回到origin
repo上github上。 : - )
您可以转到服务器并执行相同的git reset
命令,以备份其提交master
的名称。但一般情况下,Nils Werner's answer是正确的:你应该在你的回购邮件上做了git revert
,并推动它。按照惯例,这样做:
... - B - C - X - unX <-- HEAD=master
其中unX
基本上与X中更改的内容相反:如果添加了一些行,则删除它们;如果改变某些线条,将它们放回原处,等等。
将此推送到github origin
系统会在那里添加新的unX
提交,然后服务器上的pull
将获取unX
,系统将全部同步。
(您可以恢复X
然后还原,以便您“应该”完成的工作成为您所做的事情;但此时手动修复服务器可能同样容易。)