學習git reset之前先了解git的四區五狀態
一張圖理解四個區
已修改(Modified):上次提交後有修改
已暫存(Staged):通過git add 追蹤了的
已提交(Committed):通過git commit 提交到了本地倉庫
$ 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的暫存區以及工作空間的所有東西都不變。
--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 到遠端倉庫,如此一來誰都沒影響到,妙啊!!!
再看到遠端庫的提交記錄也可以看到
總結一下回退遠端倉庫:
$ git revert HEAD
$ git push
如此兩步驟即可,因為大家在push之前都會pull