git版本回退

2022-10-17 18:00:47

學習git reset之前先了解git的四區五狀態

概念

一張圖理解四個區

再是五個狀態

  • 未修改(Origin):上次提交後就沒改動過

  • 已修改(Modified):上次提交後有修改

  • 已暫存(Staged):通過git add 追蹤了的

  • 已提交(Committed):通過git commit 提交到了本地倉庫

  • 已推播(Pushed):通過git push 推播到了遠端倉庫

 

本地倉庫版本回退

$ git reset [--soft | --mixed | --hard] [HEAD]  #回退,預設為--mixed
​
--soft 、--mixed、--hard就是三個恢復等級。
​
$ git reset --soft HEAD    #回退到指定版本
$ git reset --soft HEAD~3   # 回退上上上一個版本 
​
$ git reset --hard HEAD~3  # 回退上上上一個版本  
$ git reset –hard bae128  # 回退到某個版本回退點之前的所有資訊。 
$ git reset --hard origin/master    # 將原生的狀態回退到和遠端的一樣

我需求一般都在--hard,就是我從第a個版本開始敲,刪了些核心程式碼寫了些雞肋程式碼,這個時候就可以 git reset --hard 回退到我上一次提交的版本,也就是第a個版本。這個好理解,但是需要明白三個引數的區別,回退復原的同時會不會影響本地庫的程式碼,add追蹤的程式碼,追蹤前工作區的程式碼...就需要弄明白幾個引數的作用了。

  • --soft  ,已經add的暫存區以及工作空間的所有東西都不變。
    PS:就是復原我的commit,即未做commit操作

  • --mixed預設,可以不用帶該引數,用於重置暫存區的檔案與上一次的提交(commit)保持一致,工作區檔案內容保持不變。
    PS:已經add的暫存區會丟失掉,工作空間的程式碼什麼的是不變的。我測試過了,就是僅僅取消追蹤,我工作區修改的程式碼沒影響

  • --hard,復原工作區中所有未提交的修改內容,將暫存區與工作區都回到上一次版本,並刪除之前的所有資訊提交。 那麼一切就全都恢復了,
    PS:aad的暫存區消失,程式碼什麼的也恢復到以前狀態。我測試過了,就是取消追蹤,我工作區修改的恢復到我上一次提交的版本,之前commit提交到本地倉庫的也會刪掉,換句話說新寫的程式碼等於沒寫,刪了的等於沒刪

可能需要用到的命令
$ git log    #檢視提交記錄,但不能檢視已經刪除的記錄。
$ git diff   #檢視修改過的但未add追蹤的檔案
$ git status  #檢視add追蹤過的檔案
$ git reflog   #可以檢視看所有分支的所有操作記錄(包括commit和reset的操作),包括已經被刪除的commit記錄。

遠端倉庫版本回退

學習了上邊本地庫版本回退之後,我就有了我自己的想法思路。

主要還是暫時沒有碰到類似需求吧,純當學習了

場景

當我commit程式碼到了本地庫,又push到了遠端庫,不一會我發現剛推播的版本有錯誤,我需要將遠端庫回退到上一個版本,怎麼辦?

我的思路

先檢視一下想要回退的上一個版本的head,然後reset回退指定版本

$ git reflog
$ git reset --hard Obfafd

此時本地庫落後遠端庫一次提交,那肯定直接推不過去的,因為提交記錄落後,那就強推吧嘻嘻

$ git commit -mf "強推"

這樣遠端庫就與本地庫記錄一致,程式碼一致,我要的效果達到了,但是如果在公司我可能會捱打,因為-f 強推極其不優雅。我這邊記錄倒是同步了,我這一強推就可能導致了別的小夥伴的本地庫超前遠端庫幾次提交。

所有這種方式留給自己的私有倉庫用差不多

正確方式

經過查閱資料,實際測試我又學到了

經過一個測試說明吧

首先早上我推播了一個版本到遠端庫,晚上發現了一段文字沒說明白,因為在中午可能有小夥伴提交過版本,所以我不敢也不能強推

我現在需要將遠端庫恢復到上一個版本(按理說小夥伴推播過了,我即使恢復到上一個也沒用,因為上一個是小夥伴的版本,這個也是被他合併過的,也就是說這個版本我的說明文字還是在,可以多恢復幾次,或者指定恢復,這裡測試不糾結了),

輸入命令git revert HEAD  表示回退到上一個版本(會開啟vi編輯器輸入提交資訊),此時雖然程式碼回退了,但是記錄卻是向前的,與commit非常相似,所以在之後還需要push提交到遠端倉庫

當我用revert回退之後,所有人pull之後,他們的程式碼也自動的回退了。相當於一次補償提交 然後 git push 到遠端倉庫,如此一來誰都沒影響到,妙啊!!!

再看到遠端庫的提交記錄也可以看到

總結一下回退遠端倉庫:

  1. $ git revert HEAD
    $ git push 

如此兩步驟即可,因為大家在push之前都會pull