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