這是你正在做的,以圖片的形式。
因爲「壞提交」推,對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
,然後還原,讓你「應該」做了變成你沒做什麼,但在這一點上它可能是一樣容易手動修復服務器)。
澄清,你至少有三種不同的(但是同步)回購:你的,原產地和一些服務器。正確? – torek
對不起:我的,github和服務器 – surfer190