git如何回滾遠程倉庫 切換到本地主分支

使用git管理項目開發的過程當中常常會碰到這種狀況:某次提交已經push到了遠程倉庫,但是忽然意識到「天哪,我怎麼作了這麼蠢的事情」。那麼問題來了,怎麼將遠程代碼庫回滾呢?git

在網上看到大部分人給出的解決方案是先將本地回滾,而後刪除遠程分支,以後再將本地的分支push到遠程倉庫,這實際上是一種很危險的方案,畢竟直接刪除遠程分支太狠了,不推薦這樣作。。。bash

關於遠程倉庫回滾

首先,必需要明白的一件事,任何普通用戶不能擅自作有關遠程倉庫回退的操做,若是你擅自回滾了遠程倉庫,會對項目團隊其餘人形成不可預知的影響。若是須要回退版本,先聯繫項目的倉庫管理員,在團隊其餘人都對本身本地未提交的工做作好備份以後,再進行遠程倉庫回退操做,操做結束後,團隊成員須要從新同步遠程倉庫後繼續本身的工做。測試

一般回滾遠程倉庫會有如下三種情形:spa

一、刪除最後一次提交

這種狀況是最簡單的了,只須要如下兩步就能夠了指針

git revert HEAD
    git push origin master

注意,revertreset的區別:

revert是放棄指定提交的修改,可是會生成一次新的提交,須要填寫提交註釋,之前的歷史記錄都在,而reset是指將HEAD指針指到指定提交,歷史記錄中不會出現放棄的提交記錄。若是尚未理解的話,咱們作以下測試:
假設咱們有如下三次提交記錄:code

如今咱們使用revert放棄最後一次提交,以後執行git log:開發

git revert HEAD
    git log

歷史記錄中還有第三次提交的記錄,而且多了一次的提交,可是倉庫內容已經回到了第二次提交以後的狀態。 如今咱們使用reset回到第三次提交,以後執行git log:同步

git reset --hard HEAD^
    git log

歷史記錄中已經沒有以前revert生成的提交記錄了,如今應該明白了吧。 若是刪除遠程倉庫的最後一次提交的時候不須要保留歷史記錄的話,可使用reset,命令以下:it

git reset --hard HEAD^
    git push origin master -f

-f 參數是強制提交,由於reset以後本地庫落後於遠程庫一個版本,所以須要強制提交。ast

二、刪除歷史某次提交

這種狀況須要先用git log命令在歷史記錄中查找到想要刪除的某次提交的commit id,好比下圖中圈出來的就是註釋爲"2"的提交的commit id(因而可知提交的註釋很重要,必定要認真寫)

而後執行如下命令("commit id"替換爲想要刪除的提交的"commit id",須要注意最後的^號,意思是commit id的前一次提交):

git rebase -i "commit id"^

執行該條命令以後會打開一個編輯框,內容以下,列出了包含該次提交在內以後的全部提交。

而後在編輯框中刪除你想要刪除的提交所在行,而後保存退出就好啦,若是有衝突的須要解決衝突。接下來,執行如下命令,將本地倉庫提交到遠程庫就完成了:

git push origin master -f

三、修改歷史某次提交

這種狀況的解決方法相似於第二種狀況,只須要在第二條打開編輯框以後,將你想要修改的提交所在行的pick替換成edit而後保存退出,這個時候rebase會停在你要修改的提交,而後作你須要的修改,修改完畢以後,執行如下命令:

git add .
    git commit --amend
    git rebase --continue

若是你在以前的編輯框修改了n行,也就是說要對n次提交作修改,則須要重複執行以上步驟n次。

須要注意的是,在執行rebase命令對指定提交修改或刪除以後,該次提交以後的全部提交的"commit id"都會改變。

相關文章
相關標籤/搜索