Git進階命令-reset

雨点的名字發表於2024-03-21

之前有關Git,寫過一片文章: Git五個常見問題及解決方法

Git進階命令-reset

一、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

預設方式,將撤回的程式碼,存放到工作區。同時會保留本地未提交的內容。

Git進階命令-reset

在程式碼提交後,我發現這次提交也就是 commitId 為 7812249,提交錯了,需要撤回。

同時這個時候呢,本地又新增修改了一些程式碼

Git進階命令-reset

執行命令

git reset d0eda46

注意 這裡的commitId不是提交程式碼2的,而是提交程式碼1的,因為我們想的是回到是1這個版本,別搞錯了

Git進階命令-reset

可以看出本地的程式碼和撤回的程式碼都在,且都在工作區

我們再來看下提交日誌

git log --oneline
Git進階命令-reset

可以看到 提交程式碼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
Git進階命令-reset

可以看出撤回的都返回在暫存區。


六、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 是找不回的。

Git進階命令-reset

找不到 提交程式碼3 的記錄了。 那怎麼辦呢?

可以透過 git reflog 命令實現找回

執行命令

git reflog

Git進階命令-reset

這裡能找到 commit 提交程式碼3 的記錄。那現在要做的就是撤回到當前提交的位置。

執行命令

git reset de970f2

Git進階命令-reset

全部回來啦。

注意 切記!!!工作區有未提交的程式碼時不要用這個命令,因為工作區會回滾,你沒有提交的程式碼就再也找不回了。



宣告: 公眾號如需轉載該篇文章,發表文章的頭部一定要 告知是轉至公眾號: 後端元宇宙。同時也可以問本人要markdown原稿和原圖片。其它情況一律禁止轉載!

相關文章