git 刪除遠端分支上的某次提交
使用git管理專案開發的過程中經常會碰到這種情況:某次提交已經push到了遠端倉庫,可是突然意識到“天哪,我怎麼做了這麼蠢的事情”。那麼問題來了,怎麼將遠端程式碼庫回滾呢?
在網上看到大部分人給出的解決方案是先將本地回滾,然後刪除遠端分支,之後再將本地的分支push到遠端倉庫,這其實是一種很危險的方案,畢竟直接刪除遠端分支太狠了,不推薦這樣做。。。
關於遠端倉庫回滾
首先,必須要明白的一件事,任何普通使用者不能擅自做有關遠端倉庫回退的操作,如果你擅自回滾了遠端倉庫,會對專案團隊其他人造成不可預知的影響。如果需要回退版本,先聯絡專案的倉庫管理員,在團隊其他人都對自己本地未提交的工作做好備份之後,再進行遠端倉庫回退操作,操作結束後,團隊成員需要重新同步遠端倉庫後繼續自己的工作。
通常回滾遠端倉庫會有以下三種情形:
1、刪除最後一次提交
這種情況是最簡單的了,只需要以下兩步就可以了
git revert HEAD
git push origin master
注意,revert和reset的區別:
revert是放棄指定提交的修改,但是會生成一次新的提交,需要填寫提交註釋,以前的歷史記錄都在,而reset是指將HEAD指標指到指定提交,歷史記錄中不會出現放棄的提交記錄。如果還沒有理解的話,我們做如下測試:
假設我們有以下三次提交記錄:
現在我們使用revert放棄最後一次提交,之後執行git log:
git revert HEAD git log
歷史記錄中還有第三次提交的記錄,並且多了一次的提交,但是倉庫內容已經回到了第二次提交之後的狀態。 現在我們使用reset回到第三次提交,之後執行git log:
git reset --hard HEAD^
git log
歷史記錄中已經沒有之前revert生成的提交記錄了,現在應該明白了吧。 如果刪除遠端倉庫的最後一次提交的時候不需要保留歷史記錄的話,可以使用reset,命令如下:
git reset --hard HEAD^
git push origin master -f
-f 引數是強制提交,因為reset之後本地庫落後於遠端庫一個版本,因此需要強制提交。
2、刪除歷史某次提交
這種情況需要先用git log命令在歷史記錄中查詢到想要刪除的某次提交的commit id,比如下圖中圈出來的就是註釋為”2”的提交的commit id(由此可見提交的註釋很重要,一定要認真寫)
然後執行以下命令(”commit id”替換為想要刪除的提交的”commit id”,需要注意最後的^號,意思是commit id的前一次提交):
git rebase -i "commit id"^
執行該條命令之後會開啟一個編輯框,內容如下,列出了包含該次提交在內之後的所有提交。
然後在編輯框中刪除你想要刪除的提交所在行,然後儲存退出就好啦,如果有衝突的需要解決衝突。接下來,執行以下命令,將本地倉庫提交到遠端庫就完成了:
git push origin master -f
3、修改歷史某次提交
這種情況的解決方法類似於第二種情況,只需要在第二條開啟編輯框之後,將你想要修改的提交所在行的pick替換成edit然後儲存退出,這個時候rebase會停在你要修改的提交,然後做你需要的修改,修改完畢之後,執行以下命令:
git add .
git commit --amend
git rebase --continue
如果你在之前的編輯框修改了n行,也就是說要對n次提交做修改,則需要重複執行以上步驟n次。
需要注意的是,在執行rebase命令對指定提交修改或刪除之後,該次提交之後的所有提交的”commit id”都會改變。