之前有關Git,寫過一片文章: Git五個常見問題及解決方法
一、reset命令使用場景
有時候我們提交了一些錯誤的或者不完善的程式碼,需要回退到之前的某個穩定的版本,面對這種情況有兩種解決方法:
解決方法1:修改錯誤內容,再次commit一次
解決方法2:使用git reset 命令撤銷這一次錯誤的commit
第一種方法比較直接,但會多一次commit記錄,同時並不是所有場景都可以這麼做。
所以建議使用第二種方法,因為錯誤的commit沒必要保留下來。
二、reset命令
git reset 命令用於回退版本
,可以指定退回某一次提交的版本。
reset 命令的原理是根據 commitId 來恢復版本。
因為每次提交都會生成一個 commitId,所以說 reset 可以幫你恢復到歷史的任何一個版本。
這裡的版本和提交是一個意思,一個 commitId 就是一個版本
命令格式如下:
git reset [--soft | --mixed | --hard] [HEAD]
常用命令
# 回退所有內容到上一個版本
git reset HEAD^
# 回退test.txt這個檔案的版本到上一個版本
git reset HEAD^ test.txt
# 向前回退到第3個版本
git reset HEAD~3
# 回退到某個版本51363e6
git reset 51363e6
注意:對於已經 push 的 commit,也可以使用reset命令,不過再次 push 時,由於遠端分支和本地分支有差異,需要強制推送 git push -f 來覆蓋被 reset 的 commit。
這裡非常需要注意,因為 git push -f
是一個非常危險的命令。
如果在 git push -f 之前有其他同事 push 新程式碼。那麼同事提交程式碼會丟失。
所以這裡一定要注意 git push -f 之前要先 git pull 拉下是否有新提交程式碼。
三、reset引數有哪些?
option 引數的選項有以下幾種
git reset --mixed
:此為預設方式,將撤回的程式碼,存放到工作區。同時會保留本地未提交的內容。
git reset --soft
:回退到某個版本 。將撤回的程式碼,存放到暫存區。同時會保留本地未提交的內容。
git reset --hard
:徹底回退到某個版本,丟棄將撤回的程式碼,本地沒有commit的修改會被全部擦掉。(慎用
)
下面對這三種引數分別一一透過示例演示
四、reset --mixed
預設方式,將撤回的程式碼,存放到工作區。同時會保留本地未提交的內容。
在程式碼提交後,我發現這次提交也就是 commitId 為 7812249,提交錯了,需要撤回。
同時這個時候呢,本地又新增修改了一些程式碼
執行命令
git reset d0eda46
注意
這裡的commitId不是提交程式碼2的,而是提交程式碼1的,因為我們想的是回到是1這個版本,別搞錯了
可以看出本地的程式碼和撤回的程式碼都在,且都在工作區
。
我們再來看下提交日誌
git log --oneline
可以看到 提交程式碼2
的提交記錄已經沒有了。
五、reset --soft
soft和mixed差別並不大,無非就是一個回退到暫存區一個回退到工作區。
我們來演示下,把上面三個檔案重新提交一次
$ git commit -a -m '提交程式碼2'
[feature ebb89a1] 提交程式碼2
3 files changed, 5 insertions(+), 2 deletions(-)
然後再來執行reset命令
git reset --soft d0eda46
可以看出撤回的都返回在暫存區。
六、reset --hardt
這個命令和前面差別就非常大了,它不僅會丟棄錯誤commit提交的程式碼,而且本地沒有commit的修改會被全部擦掉,關鍵是這種情況原生代碼一旦擦掉是沒有任何辦法在找回來了。
同樣我們把上面的程式碼再次提交
$ git commit -m '提交程式碼3'
[feature de970f2] 提交程式碼3
3 files changed, 5 insertions(+), 2 deletions(-)
然後再來執行reset命令
git reset --hard d0eda46
在看本地
$ git status
On branch feature
nothing to commit, working tree clean
在工作區和暫存區已經沒有任何程式碼了,也就是如果這個時候你本地開發的程式碼沒有提交,那就永遠也找不回來了。
那之前提交過的但又撤回的 提交程式碼3
的程式碼可以找回嗎?
這個是可以的。
我們透過 git log --oneline
是找不回的。
找不到 提交程式碼3
的記錄了。 那怎麼辦呢?
可以透過 git reflog 命令實現找回
執行命令
git reflog
這裡能找到 commit 提交程式碼3
的記錄。那現在要做的就是撤回到當前提交的位置。
執行命令
git reset de970f2
全部回來啦。
注意
切記!!!工作區有未提交的程式碼時不要用這個命令,因為工作區會回滾,你沒有提交的程式碼就再也找不回了。
宣告: 公眾號如需轉載該篇文章,發表文章的頭部一定要 告知是轉至公眾號: 後端元宇宙。同時也可以問本人要markdown原稿和原圖片。其它情況一律禁止轉載!