Git進階命令-reset

之前有關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原稿和原圖片。其它情況一律禁止轉載!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章