1. git log (找到你想要回退的版本id,將它複製下來)git
2. git reset --hard 版本id (本地回退到目標版本)gitlab
3.git push --force (推送到遠程倉庫,實現回退)fetch
1. git log (找到你想要刪除的版本id,將它複製下來)3d
2. git revert 版本id (本地回退到目標版本)blog
3.git push --force (推送到遠程倉庫,實現回退)it
reset與revert最大的區別在於:revert是新提交一個commit來撤回代碼,而reset只是回到某個版本的代碼commit原理
雖然二者都能回退到你想要的代碼,可是對於遠程倉庫,當使用reset回退,其餘同事的代碼pull release拉最新代碼,拉取到的結果並不會回退你的代碼,由於pull是fetch與merge的結果,對於已有的commit進行merge是沒有效果的。request
而revert是新的commit,此時merge新的commit就能回退到你的代碼im
git branch backupd3
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
提測的代碼(已合入release),決定暫時不上生產,須要回退遠程倉庫的代碼
舉例以下:B與D的代碼須要回退,A爲線上版本,C爲其餘同事提交的代碼
對一個文件新增b,c,d的三個修改,分別提交
目標是回退BD剩下AC
直接從最新的版本修改代碼,修改到咱們想要版本,而後再提交上去,也就是手工回退。在這個例子中就是直接刪除‘bd’後提交
手工改代碼很容易出錯
(1) 沒有回退全部須要回退的代碼
(2) 刪除了不須要回退的代碼
存在問題:
(1) 須要回退的代碼夾雜了其餘同事的commit,直接reset會把其餘同事的代碼也刪除掉
(2) 遠程倉庫後退後,須要其餘同事未回退的同事手動reset它們的本地倉庫,不然其餘同事提交會把刪除的代碼再次提交上去
與2.2 reset類似:
從要刪除的版本的前一個版本拉一個拷貝分支,而後在遠程倉庫刪掉release分支,再將拷貝分支推到遠程release。
存在問題:須要讓其餘同事(本地版本領先於回退後的遠程倉庫版本)重拉項目或回退
Revert做用是消除一個commit,它的原理是新建一個commit反向修改目標commit
Revert與reset最主要的區別:revert是去除一個commit,reset是回到某個版本
對於此場景適用revert,咱們只要把B與D的提交revert掉,就能達到目的
Revert實現的回退,不須要其餘同事重拉項目或者手動回退項目
須要注意的是在gitlab上revert,必須是無衝突的時候才成功,在此場景下有衝突就失敗了
(1) 回到某個版本,使用reset;消除某個commit,使用revert
(2) 使用git reset實現回退到某個版本,須要讓其餘同事也回退或者重拉項目
(3) Revert有可能要手動處理衝突,reset沒有這個問題
(4) 對release分支使用git push –force(強制推送)有風險,應該進行備份;或者對本身的分支進行revert,而後提merge request合併到release
(5) 若是沒有revert衝突,建議在gitlab上執行revert