假如仓库中有三次未推送的提交V1、V2、V3
HEAD~ HEAD
| |
| v
| master
| |
v v
V1 <- V2 <- V3
本地仓库(HEAD) 暂存区(index) 工作区(working)
commited状态 added状态 modify状态
V3 V3 V3
一、重置整个版本
1、只移动HEAD,使HEAD指向V2
git reset --soft HEAD~
HEAD~ HEAD
| |
| v
| master
| |
v v
V1 <- V2 <- V3
本地仓库(HEAD) 暂存区(index) 工作区(working)
commited状态 added状态 modify状态
V2 V3 V3
撤销上一次提交,不取消之前的暂存,可以继续暂存新的修改。此操作使本地仓库恢复到V2版本的状态,V3版本未提交已添加。
2、更新索引,使HEAD指向V2且索引为V2的状态
git reset [--mixed] HEAD~
HEAD~ HEAD
| |
| v
| master
| |
v v
V1 <- V2 <- V3
本地仓库(HEAD) 暂存区(index) 工作区(working)
commited状态 added状态 modify状态
V2 V2 V3
撤销上一次提交,且取消上一次提交的所有暂存。此操作使暂存区和本地仓库恢复到V2版本的状态,V3版本未暂存已修改。
3、更新工作目录,使HEAD指向V2且索引和工作区均为V2的状态
git reset --hard HEAD~
HEAD~ HEAD
| |
| v
| master
| |
v v
V1 <- V2 <- V3
本地仓库(HEAD) 暂存区(index) 工作区(working)
commited状态 added状态 modify状态
V2 V2 V2
撤销上一次提交,取消上一次提交的所有暂存,抛弃上一次提交的所有暂存的修改,此操作销毁了数据,覆盖了工作区。在这种特殊情况下,我们的 Git 数据库中的一个提交内还留有该文件的 V3 版本, 我们可以通过 reflog 来找回它。但是若该文件还未提交,Git 仍会覆盖它从而导致无法恢复。此操作使工作目录、暂存区和本地仓库均恢复到V2版本的状态
二、通过路径来重置指定文件
HEAD~ HEAD
| |
| v
| master
| |
v v
V1 <- V2 <- V3
本地仓库(HEAD) 暂存区(index) 工作区(working)
commited状态 added状态 modify状态
V3 V4 V4
1、文件file.txt的版本为V4且已暂存,执行如下命令:
git reset file.txt(git reset [--mixed] HEAD file.txt 的简写)
HEAD~ HEAD
| |
| v
| master
| |
v v
V1 <- V2 <- V3
本地仓库(HEAD) 暂存区(index) 工作区(working)
commited状态 added状态 modify状态
V3 V4 V4
文件file.txt的版本变为V3
2、文件file.txt的版本为V4且已暂存,执行如下命令:
git reset HEAD~ file.txt
HEAD~ HEAD
| |
| v
| master
| |
v v
V1 <- V2 <- V3
本地仓库(HEAD) 暂存区(index) 工作区(working)
commited状态 added状态 modify状态
V3 V4 V4
文件file.txt的版本变为V2