[TOC] #### 1. 前言 --- git reset 命令用于回退到指定版本,是 git 的 "后悔藥" 如果創(chuàng)建了一個(gè)新的文件,這個(gè)文件是未跟蹤的狀態(tài),那么使用 reset 回退版本時(shí),這個(gè)新文件不會(huì)受到影響 如果創(chuàng)建了一個(gè)新的文件,并且這個(gè)文件已被跟蹤(已被提交到暫存區(qū)),那么使用 reset 回退版本時(shí),這個(gè)新文件就會(huì)被刪除 #### 2. 回退類型 --- 指針移動(dòng)的時(shí)候,暫存區(qū),工作區(qū)都不動(dòng)。重置 git commit ``` git reset --soft [commit id] ``` 指針移動(dòng)的同時(shí),重置暫存區(qū),但是工作區(qū)不動(dòng)。重置 git commit、git add ``` git reset --mixed [commit id] ``` 指針移動(dòng)的同時(shí),重置暫存區(qū)和工作區(qū)。重置 git commit、git add 和工作副本的修改 ``` git reset --hard [commit id]] ``` 使用示例: 回退到指定版本 ``` # 命令格式 git reset --hard <commit id> # commit id 使用完整的值或前 7 位都可以 git reset --hard 75e24ff git reset --hard 75e24ff4f6da07bfd300fc6b4249914b9958634c ``` #### 3. 測(cè)試回退類型 --- 先準(zhǔn)備好一個(gè)用來(lái)測(cè)試的倉(cāng)庫(kù),第一次提交只有一個(gè) 1.txt 文件,第二次提交新增一個(gè) 2.txt,以此類推,提交五次 ![](https://img.itqaq.com/art/content/563142e6b7a11b52ed87edd59e11681a.png) 修改 1.txt、2.txt,創(chuàng)建 6.txt、7.txt,將 2.txt、7.txt 提交到暫存區(qū)(當(dāng)前處于最新的一次提交中) ```php vim 1.txt vim 2.txt touch 6.txt 7.txt git add 2.txt 7.txt ``` ![](https://img.itqaq.com/art/content/81fbf430b0501324ef4df85894e4950d.png) **`--soft` 參數(shù)只會(huì)重置 commit,不會(huì)重置 add 和工作區(qū)副本的修改** 工作區(qū): 修改了已被 git 跟蹤的 1.txt,不會(huì)重置它的文件內(nèi)容。6.txt 是新文件,它的狀態(tài)也不會(huì)改變,還是未跟蹤狀態(tài) 暫存區(qū): 暫存區(qū)中的 2.txt 修改狀態(tài)和 7.txt 的新文件狀態(tài)保留 版本庫(kù): 因?yàn)?3.txt、4.txt、5.txt 是之后當(dāng)前版本才加入版本庫(kù)的,git 重置 commit 后自動(dòng)將它們放到了暫存區(qū) ![](https://img.itqaq.com/art/content/c3bf35ecb0b617f9e41ffbe401a523cb.png) **`--mixed` 參數(shù)會(huì)重置 commit 和 add ,不會(huì)重置工作區(qū)副本的修改** 其實(shí)就是在 `--soft` 參數(shù)的基礎(chǔ)上,又重置了 add 操作 ![](https://img.itqaq.com/art/content/d7abd8fa6faf61ad04be2d9450a1b0dd.png) **`--hard` 參數(shù)會(huì)重置 commit 和 add ,也會(huì)重置工作區(qū)副本的修改** 其實(shí)就是在 `--mixed` 參數(shù)的基礎(chǔ)上,又重置了文件的修改。在后面版本跟蹤的文件,也會(huì)被刪除,比如: 3.txt、4.txt、5.txt、7.txt ![](https://img.itqaq.com/art/content/6e5874590e346945d0fa61f48755360f.png) #### 4. HEAD 的用法 --- 回退到當(dāng)前版本,下面兩種用法等價(jià) (放棄所有修改) ``` git reset --hard git reset --hard HEAD ``` 回退到上一個(gè)版本 ``` git reset --hard HEAD^ ``` 回退到上上一個(gè)版本 ``` git reset --hard HEAD^^ ``` #### 5. 回退遠(yuǎn)程庫(kù)版本 --- 本地庫(kù)回退版本 ``` git reset --hard <commit id> ``` `-f, --force` 將本地庫(kù)版本強(qiáng)制推送到遠(yuǎn)程庫(kù)(必須加 -f 參數(shù)) ``` git push -f origin <branch> ```