[TOC] #### 1. 前言 --- git reset 命令用于回退到指定版本,是 git 的 "后悔药" 如果创建了一个新的文件,这个文件是未跟踪的状态,那么使用 reset 回退版本时,这个新文件不会受到影响 如果创建了一个新的文件,并且这个文件已被跟踪(已被提交到暂存区),那么使用 reset 回退版本时,这个新文件就会被删除 #### 2. 回退类型 --- 指针移动的时候,暂存区,工作区都不动。重置 git commit ``` git reset --soft [commit id] ``` 指针移动的同时,重置暂存区,但是工作区不动。重置 git commit、git add ``` git reset --mixed [commit id] ``` 指针移动的同时,重置暂存区和工作区。重置 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. 测试回退类型 --- 先准备好一个用来测试的仓库,第一次提交只有一个 1.txt 文件,第二次提交新增一个 2.txt,以此类推,提交五次  修改 1.txt、2.txt,创建 6.txt、7.txt,将 2.txt、7.txt 提交到暂存区(当前处于最新的一次提交中) ```php vim 1.txt vim 2.txt touch 6.txt 7.txt git add 2.txt 7.txt ```  **`--soft` 参数只会重置 commit,不会重置 add 和工作区副本的修改** 工作区: 修改了已被 git 跟踪的 1.txt,不会重置它的文件内容。6.txt 是新文件,它的状态也不会改变,还是未跟踪状态 暂存区: 暂存区中的 2.txt 修改状态和 7.txt 的新文件状态保留 版本库: 因为 3.txt、4.txt、5.txt 是之后当前版本才加入版本库的,git 重置 commit 后自动将它们放到了暂存区  **`--mixed` 参数会重置 commit 和 add ,不会重置工作区副本的修改** 其实就是在 `--soft` 参数的基础上,又重置了 add 操作  **`--hard` 参数会重置 commit 和 add ,也会重置工作区副本的修改** 其实就是在 `--mixed` 参数的基础上,又重置了文件的修改。在后面版本跟踪的文件,也会被删除,比如: 3.txt、4.txt、5.txt、7.txt  #### 4. HEAD 的用法 --- 回退到当前版本,下面两种用法等价 (放弃所有修改) ``` git reset --hard git reset --hard HEAD ``` 回退到上一个版本 ``` git reset --hard HEAD^ ``` 回退到上上一个版本 ``` git reset --hard HEAD^^ ``` #### 5. 回退远程库版本 --- 本地库回退版本 ``` git reset --hard <commit id> ``` `-f, --force` 将本地库版本强制推送到远程库(必须加 -f 参数) ``` git push -f origin <branch> ```