git reset 用法

admin發表於2018-07-27

git reset命令是Git提供的後悔藥之一,它可以幫我們把內容恢復到指定的commit提交版本。

首先看一下當前專案的commit提交歷史:

[Shell] 純文字檢視 複製程式碼
$ git log --oneline

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/27/014223zj924xxrooo1j3io.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

當前(c4版本)readme.txt檔案內容如下:

[HTML] 純文字檢視 複製程式碼
螞蟻部落一
螞蟻部落二
螞蟻部落三
螞蟻部落四

現在要恢復到c3版本,程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ git reset 937dd8e --hard

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/27/014313lta5uctrujvamguu.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

readme.txt檔案內容已經變為:

[HTML] 純文字檢視 複製程式碼
螞蟻部落一
螞蟻部落二
螞蟻部落三

reset翻譯成中文有重置的意思,恰如起名,git reset命令可以重置當前分支所指向提交的位置,很多教程說此命令的作用是刪除分支或者提交,其實這是完全錯誤的,commit提交依然存在,只是當前分支所指向的commit提交進行了重置,分支所指向的新commit提交之後的提交就像消失了一樣(git log無法查詢到)。

一.命令解析:

(1).git reset後面緊跟的引數是指定commit提交的標識。

(2).標識可以是sha-1值或者HEAD、HEAD^或者分支名稱等形式。

(3).--hard的作用在文章後面介紹。

二.程式碼例項:

(1).使用sha-1值作為引數:

前面程式碼我們將分支重置到937dd8e版本,下面再還原回去:

[Shell] 純文字檢視 複製程式碼
$ git reset 5609309 --hard

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/27/014417mca9fcvbafcur1o5.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

(2).使用HEAD作為引數:

再重置到937dd8e提交,程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ git reset HEAD^ --hard

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/27/014502r6rtpcppt6j6772t.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

HEAD執行當前分支,^當前分支所指向提交的前一個提交,^^表示當前分支所指向提交的前一個分支的前一個分支,以此類推;^^過多自然不太方便,可以使用HEAD~2表示。

(3).使用分支名稱作為引數:

現在本人事先將分支指向最後一次commit,下面使用分支名稱作為引數,將分支指向前一個commit(937dd8e)。

程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ git reset master^ --hard

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/27/014541loz9s8vu3pp4g3po.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

三.mixed、soft和hard:

(1).--mixed:預設值,當重置分支所指向commit提交位置時,暫存區中的內容會被新指向的commit提交內容所替換,工作區內容不變。

(2).--soft:暫存區和工作區的內容都保持原樣,不會被替換。

(3).--hard:暫存區和工作區的內容都會被新指向的commit提交內容所替換;git reset --hard隻影響被跟蹤的檔案,如果工作區有新增的檔案,並不會被影響。

最後說明:

假如commit已經被push到遠端倉庫上,那麼其他開發人員可能會基於對應的commit提交進行開發產生新的commit,如果此時進行reset操作,會造成其他開發人員的提交歷史丟失,這可能會產生嚴重後果。

相關文章