Git Reset不会改变服务器版本?

时间:2014-01-14 12:55:43

标签: git github

其中一个团队提交了一个提交并推送到远程,我们所有人,包括服务器都提取了最新版本。

但是现在它打破了应用程序的重要部分。所以我们:

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上的仓库,然后是服务器版本,然后是我的本地。

2 个答案:

答案 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然后还原,以便您“应该”完成的工作成为您所做的事情;但此时手动修复服务器可能同样容易。)