Git学习笔记:命令reset和checkout在“重置”功能中的区别及其注意事项

本随笔介绍在Git系统中,命令git reset和命令git checkout在实现重置功能中常用的选项及这两个命令之间的区别,以及在重置过程中一些需要注意的地方。

本随笔作者还在学习阶段,对Git软件的理解和使用还不够透彻,难免会出现一些书写上或技术上的问题,若出现了问题欢迎在评论区或私信与我讨论。本随笔的内容整理自官方文档

Git中的重置

在使用Git的过程中,难免会出现这样一种情况:已经进行过一次提交,工作区和暂存区都是干净的状态,但是因为一些原因,需要将工作区或/和暂存区里的文件重置为某个先前的版本来测试以前的功能,这就需要用到Git提供的重置功能。Git通常是使用git resetgit checkout来实现重置功能,这两个命令在使用过程中会有明显的区别。

重置完整的内容

仅重置最后一次提交

git reset --soft [commit]
该命令会将最后一次提交的HEAD指针和Branch引用同时重置到参数[commit]指向的提交。这里隐含着一个执行后会发生的情况:暂存区会变为最后一次提交之前的状态,因为暂存区的内容和最后一次提交的内容不再相同。

重置最后一次提交和暂存区

git reset [--mixed] [commit]
同上一个命令一样,该命令会将最后一次提交的HEAD指针和分支引用同时重置到参数[commit]指向的提交,但是会有一部额外的操作,将当前HEAD指针指向的提交的内容复制到暂存区里,因此上一个命令提到的“暂存区会变为最后一次提交之前的状态”将不会出现,但是基于同样的理由,工作区的状态会变为最后一次提交之前的状态。

重置三棵树(仓库、暂存区和工作区)

git reset --hard [commit]
该命令在上一个命令的基础上,及将HEAD指针指向的提交的内容复制到暂存区里之后,还会将这个内容复制到工作区,因此并不会出现暂存区和/或工作区的状态变为最后一次提交之前的状态。但是因此也表明工作区内所有为暂存提交的内容将会被永久丢弃。
git checkout <commit>
该命令的功能同reset版本的一致,也是将“三棵树”重置为指定<commit>提交的内容,但是有一个最主要的区别就是,checkout版本的操作仅仅只会将HEAD制动到指定的<commit>提交,而不会移动分支引用,也就是说HEAD指针变成了游离态,并没有指向任何分支,这里隐含了两个要点:1、只要知道之前分支的名字,那我们还能够通过resetcheckout命令还原到之前分支的状态。2、工作区域的内容不会被丢弃掉,因为还存在于之前的分支上,但并不存在于HEAD指针指向的提交,因为HEAD已经从之前的分支上分离开了。

重置指定的文件

不像重置完整内容的版本有那么多变体,重置指定文件的版本仅仅只有两条条命令(reset版本和checkout版本各一条),且这两条命令都不会移动HEAD指针和分支引用。

git reset [commit] <paths>:该命令会将当前暂存区的状态恢复回[commit]时候的状态。
git checkout [commit] <paths>:该命令会将暂存区工作区的内容恢复回[commit]时候的状态。

posted @ 2021-10-11 21:57  U_N_Owen  阅读(709)  评论(0编辑  收藏  举报