git reset 的简单入门
前置基础:了解 git 中 版本库(HEAD 文件树),暂存区(INDEX),工作区(WORKSPACE)相关概念;知道 git 基础命令的使用,如:git init,git commit,git add;了解基本 Linux 文件操作。
实验准备:# 创建实验用本地 git 仓库 “learn” # 进入 git 仓库,进行以下操作,获得实验用环境(三个历史记录) git init echo 'v1' > test git add . git commit -m 'v1' echo 'v2' > test git add . git commit -m 'v2' echo 'v3' > test git add . git commit -m 'v3' # 由此,我们能获得如下文件树 <center class="half"> <img src="https://i-blog.csdnimg.cn/direct/5ce35722b62e4219a97d1b5f3d92502c.png" height=150/> <img src="https://i-blog.csdnimg.cn/direct/2227c425f5554289b3d2b3787a8173be.png" height=150/> </center> 本文聚焦: - git reset 的三大重要选项(--soft,--mixed,--hard)的区别,以及在三者版本管理时的运用; - HEAD 指针的相关操作,如何回退到特定版本。
-
作用:通过管理三个文件树(HEAD,index,workspace)的文件,实现版本的回退。
-
语法格式:git reset [–soft | --mixed | --hard | … ] [HEAD]
- git reset:命令主体
- [–soft | --mixed | --hard | … ]:命令选项,决定命令的影响程度
- [HEAD]:头指针要移动到的位置
相对位置:
HEAD,当前位置;
HEAD^,当前位置的前一位;
HEAD^2,当前位置前两位;(或 HEAD^^)
……。(上述 ^ 可改为 ~)
版本号:
利用 git log 查找特定版本的版本号(或利用 vscode 插件 git graph),通过该版本号回退到对应版本
id 号:
使用 git tag 命令打标签,同样可以定位版本,此处暂不细谈
-
三大选项
--soft:只移动 HEAD ,不影响 index 与 workspace 中的文件图解如下
如下是执行了 git reset --soft HEAD^ 的版本树图
可见,master的 HEAD 回退了一格(版本库中的 v3 本清除)
用 git status 查询状态,可见,暂存区的 v3 变更仍处于待提交状态,即为影响到暂存区,我们可以很方便的使用 git commit -m ‘v3’ 将 v3 还原。
我们使用 cat 查看文档内容,仍是 v3 ,可见 命令也没影响到工作区。
重新还原 v3 继续实验。
--mixed:这是 git reset 的默认选项,移动 HEAD,同时将 INDEX 清除
如下是执行了 git reset HEAD^ 的版本树图
git status
发现,缓存区的 test 与 workspace 不一致
git diff
v3 缓存被清除,缓存区回退到 v2 ,“红色”表示工作区与暂存区不一致
利用以下命令查看 工作区 的文件情况
cat test
如果要重新提交 v3 需利用 git add 同步“工作区”与“暂存区”
git add .
git commit -m "v3"
--hard:同时改变 HEAD INDEX WORKSPACE
版本树如下
git status
由于 缓存区 工作目录 HEAD 相同,系统判定“无更改”
cat test
可见工作目录的文件被更改了。
由此可见,一但使用 --hard,就丢失了任何 v3 的更改,无法挽回,必须慎用!!!
4. HEAD 巧用
git reset HEAD $FileName
用于撤回对 $FileName 的 git add 操作,使得 git commit 不会将它一起提交。
git reset HEAD $FileName 使用前
使用后