那麼當你執行 git reset --hard
之後,歷史紀錄是不能跟遠程的記錄直接合並的。
舉個例子,遠程是 A -> B -> C -> D
,你 git reset --hard
之後是
A -> B
。這時候除非遠程那邊抹掉 C
和 D
,否則是不能合併的。
因此,這時候,你應該使用 git push origin master --force
來強行覆蓋遠程記錄。
請不要根據提示使用 git pull
。否則,你的本地又會變成
A -> B -> C -> D
。因爲 git pull
相當於 git fetch
+
git merge
(以下內容基於上面的例子,遠程是 A -> B -> C -> D
,你想回滾到 B 那個狀態)
樓上提到了 git revert
。其實,git reset --hard
和
git revert
都可以實現“回滾代碼”。但區別在於:
git revert
會把你的本地變成 A -> B -> C -> D -> E
。其中,E
乾的事兒是刪除
C
和 D
。這樣做的好處在於,你 git push origin master
就不會有上面的報錯了。但,歷史線上還是會保留
C
和 D
這兩個 commit。如果使用這個命令,記得要 add
然後
commit
。
git reset --hard
會直接刪掉 C
和
D
,形成 A -> B
這樣的結果。好處在於更直接更徹底。缺點在於,首先要通過 git push origin master --force
去強行更改。其次,一旦你後悔了,除非根據本地的
reflog
直接恢復 HEAD 指針,此外沒有其他辦法。