git | reset命令

git reset 命令是git中最常用的命令,但也是最危险,最容易被误用的命令。

一、master 分支
我们知道git在初始化时,会为我们默认创建一个master分支,那这个master到底是什么呢?其实它在.git目录下对应了一个引用文件-----.git/refs/heads/master文件,而该文件的内容便是该分支中最新的一次提交的ID:

$ cat .git/refs/heads/master
22f8aae534916e1174711f138573acfbb47e489c
 
$ git log --oneline
22f8aae git ignore file added.
4e79a0b Rename third to third.txt
46ae7e3 remove branch_first.txt file from master branch
55d1e70 branch first file
545a382 Merge commit '35bbd32'

当我们用以上查看master文件内容时,发现它果然记录了最新一次的提交。了解了这个前提,那我们来分析下git reset到底做了什么?

二、reset命令
以上面的例子为基础首先来执行一个reset命令,reset到上一次提交

$ git reset --hard HEAD^
HEAD is now at 4e79a0b Rename third to third.txt
 
Quadrangle@QUADRANGLE-PC /d/GitRepo/GitOne (master)
$ git log --oneline
4e79a0b Rename third to third.txt
46ae7e3 remove branch_first.txt file from master branch
55d1e70 branch first file
545a382 Merge commit '35bbd32'

解释:
HEAD^的意思就是最新一次提交的父提交,reset后,我们看一下提交日志,发现最新一次提交没了。到底git做了什么呢?我们还能找回最新的一次提交吗?

回答上面两个问题,就用到上面就到的master引用文件了,这是我们再看一下这个文件的内容有什么变化?

$ cat .git/refs/heads/master
4e79a0ba92f1ae63dc661e29343fa0c369ca480d

发现了吧,里面记录了reset后的最后一次提交。这时或许我们有所觉察了。先不急着下结论,我们看怎么回到最新的提交呢?其实reset后,git没有删除最新提交的相关信息(实际提交记录),包括目录树,因此只要我们记住提交ID,便可以重新reset回来:

$ git reset --hard 22f8aae
HEAD is now at 22f8aae git ignore file added.
 
$ git log --oneline
22f8aae git ignore file added.
4e79a0b Rename third to third.txt
46ae7e3 remove branch_first.txt file from master branch
55d1e70 branch first file
545a382 Merge commit '35bbd32'

这样查看log,发现最新提交又回来了。但是如果我们忘了最新提交ID 怎么办呢?好办,reflog命令可以最总引用变更的记录:

Quadrangle@QUADRANGLE-PC /d/GitRepo/GitOne (master)
$ git reflog
22f8aae HEAD@{0}: reset: moving to 22f8aae
4e79a0b HEAD@{1}: reset: moving to HEAD^
22f8aae HEAD@{2}: reset: moving to 22f8aae
4e79a0b HEAD@{3}: reset: moving to HEAD^

我们可以找到前面任意操作的记录,并且可以reset到任意提交。

在这里插入图片描述
其实reset命令有两种用法:

git reset [-q] [commit] [--] <paths>

git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]

第一种用法是不会重置引用的,即不会修改master文件。只是用某一次提交的文件提交暂存区的文件

第二种用法不使用 则会重置引用,并且参数不同决定是否覆盖暂存区和工作区:

  • –hard参数会执行途中1,2,3 全部动作,即版本库,暂存区,工作区全部用指定提交版本的内容替换掉。
  • –soft 参数只执行1, 不进行暂存区和工作区的覆盖,只回退了commit的信息(清除了版本库的本次提交),如果还要提交,直接commit即可。
  • –mixed或不使用参数(默认就是mixed),执行1,2回退commit的信息(清除了版本库的本次提交)和覆盖暂存区,但不覆盖工作区。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值