2014-01-14 32 views
0

其中一個團隊做了一個提交併推送到了遠程,我們所有人,包括服務器都拉了最新版本。Git重置不會更改服務器版本?

但現在它已經打破了應用程序的重要組成部分。所以我們:

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

澄清,你至少有三種不同的(但是同步)回購:你的,原產地和一些服務器。正確? – torek

+0

對不起:我的,github和服務器 – surfer190

回答

4

您不應該重寫歷史記錄來修復錯誤。相反,revert斷裂承諾:

git revert HEAD 
git push origin master 

您可以通過在時間向前撤消從一改以往的方式。

要解決你的服務器,你需要reset到遠程分支:

git fetch origin 
git reset --hard origin/master 

其中origin是,你有你的服務器和master上的遠程名字是你工作的分支上。

這會使您的master分支處於與origin上的master分支處於相同狀態。

背景:pull試圖將merge遠程的對應分支插入本地。由於遙控器上的分支比本地「短」,因此沒有任何合併,merge只會說「好吧,我完成了,兩個分支都是最新的」。

+0

哦,'revert'ing允許你撤銷幾個星期前的提交:'git revert '。你做這件事的方式不會放棄幾周的工作。 –

1

這是你正在做的,以圖片的形式。

因爲「壞提交」推,對origin(大概github上)你有一些提交,這樣的事情:

... - B - C 
      \ 
       X <-- HEAD=master 

其中X是「壞」的承諾。然後,您將自己的repo和服務器的repo同步,以便它們具有相同的提交順序。 (我在序列中用這個有趣的彎曲畫出了它,以便下面的圖更有意義。)

現在你自己的系統上,在你的回購,你「倒帶」的HEAD分支(大概master,但是這適用即使是一些其他的分支)一個承諾:

... - B - C  <-- HEAD=master 
      \ 
       X 

注意,提交X仍然存在(在reflog歷史記錄中,在github和服務器上),這只是您的回購,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,它應該掛在它上面,因爲可能任何添加它的人都會出現,並將其推回到github上的origin回購站。 :-)


可以去到服務器,做同樣的git reset命令,備份思路,其中提交master應該命名。一般來說,Nils Werner's answer是正確的:你應該在你的repo上完成git revert,並推送它。 Pictorally,這將做到:

... - B - C - X - unX <-- HEAD=master 

其中unX基本上是不管的X改爲相反:如果添加一些線條,將其刪除;如果一些線路改了,把它們放回他們的方式,等等。

推動這GitHub的origin系統將添加新的unX提交那裏,然後pull荷蘭國際集團在服務器上會拿起unX而且系統會全部同步。

(您可以恢復X,然後還原,讓你「應該」做了變成你沒做什麼,但在這一點上它可能是一樣容易手動修復服務器)。

相關問題