先来看看.git/refs/heads/master文件的内容

[root@git demo]# cat .git/refs/heads/master
e97f443b2d1cee7eeca7dc2e768f599980788c3c

 我们再创建一个新的文件提交。看一下这个naster文件内容的变化

[root@git demo]# touch new-commit.txt
[root@git demo]# git add new-commit.txt
[root@git demo]# git commit -m "touch new-commit.txt"
[master cf295ca] touch new-commit.txt
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 new-commit.txt

 再次进行查看时master文件的内容指向了新的提交

[root@git demo]# cat .git/refs/heads/master
cf295cac46321150dcb34d8b75b2dcbd8284efa3

 看一下提交日志

[root@git demo]# git log --graph --oneline
* cf295ca touch new-commit.txt
* e97f443 version 2 welcome
* 986a1bd initwelcome

 引用refs/heads/master就好像是一个游标,在有新的提交发生的时候指向了新的提交。Git提供了git reset命令。可以将游标指向任意一个存在的ID。

[root@git demo]# git reset --hard HEAD^
HEAD is now at e97f443 version 2 welcome
[root@git demo]# cat .git/refs/heads/master
e97f443b2d1cee7eeca7dc2e768f599980788c3c       //再次查看的时候指向了前一次提交的ID

[root@git demo]# ls          //再次查看时发现new-commit.txt文件也丢失了
welcome.txt

重置命令不仅可以重置到前一次的提交状态,而且还可以直接使用提交ID重置到任何一次提交。

[root@git demo]# git log --graph --oneline
* e97f443 version 2 welcome
* 986a1bd initwelcome
[root@git demo]# git reset --hard 986a1bd
HEAD is now at 986a1bd initwelcome
[root@git demo]# cat welcome.txt
Hello.

 使用重置命令很危险,会彻底丢失历史数据,如果没有记下重置前master分支指向的提交ID,想要重置回原来的提交,可以通过.git/logs目录下日志文件记录了分支的变更。

我们查看一下这个日志文件:

[root@git demo]# tail .git/logs/refs/heads/master
0000000000000000000000000000000000000000 986a1bd458ef762ddb4e4622023e8b7d4044a665 Gao Yue <dgy@89mc.com> 1503633306 +0800 commit (initial): initwelcome
986a1bd458ef762ddb4e4622023e8b7d4044a665 e97f443b2d1cee7eeca7dc2e768f599980788c3c Gao Yue <dgy@89mc.com> 1503638749 +0800 commit: version 2 welcome
e97f443b2d1cee7eeca7dc2e768f599980788c3c cf295cac46321150dcb34d8b75b2dcbd8284efa3 Gao Yue <dgy@89mc.com> 1503647452 +0800 commit: touch new-commit.txt
cf295cac46321150dcb34d8b75b2dcbd8284efa3 e97f443b2d1cee7eeca7dc2e768f599980788c3c Gao Yue <dgy@89mc.com> 1503647978 +0800 HEAD^: updating HEAD
e97f443b2d1cee7eeca7dc2e768f599980788c3c 986a1bd458ef762ddb4e4622023e8b7d4044a665 Gao Yue <dgy@89mc.com> 1503649913 +0800 986a1bd: updating HEAD

 可以看出这个文件记录了master分支指向的变迁,最新的改变追加到文件的末尾,因此最后出现。最后一行可以看出因为执行了git reset --hard,指向的提交ID由e97f4变为了986a1。git提供了一个git reflog命令,对这个文件进行操作,使用show子命令可以显示此文件内容。

[root@git demo]# git reflog show master
986a1bd master@{0}: 986a1bd: updating HEAD
e97f443 master@{1}: HEAD^: updating HEAD
cf295ca master@{2}: commit: touch new-commit.txt
e97f443 master@{3}: commit: version 2 welcome

 查看git reflog的输出和直接查看日志文件最大的不同在于显示顺序不同,即最新改变放在了最前面显示,而且只显示每次改变的最终的哈希值。还有一个重要的区别在于git reflog命令的输出还提供了一个方便的表达式<refname>@{<n>}。这个含义是引用<refname>之前第<n>次改变时的哈希值。

 操作一下将master重置为两次改变之前的值:

[root@git demo]# git reset --hard master@{2}
HEAD is now at cf295ca touch new-commit.txt

重置后工作区中的new-commit.txt文件回来了
[root@git demo]# ls
new-commit.txt welcome.txt

提交历史也回来了
[root@git demo]# git log --oneline
cf295ca touch new-commit.txt
e97f443 version 2 welcome
986a1bd initwelcome

再用reflog查看,会看到恢复master的操作也记录到日志了

[root@git demo]# git reflog show master
cf295ca master@{0}: master@{2}: updating HEAD
986a1bd master@{1}: 986a1bd: updating HEAD
e97f443 master@{2}: HEAD^: updating HEAD
cf295ca master@{3}: commit: touch new-commit.txt
e97f443 master@{4}: commit: version 2 welcome

第三节《Git重置》的更多相关文章

  1. 完整学习git五git重置

    git重置命令的一个用途就是修改引用的游标指向 1查看git操作日志 git reflog 2查看当前head游标的指向 cat .git/refs/heads/master 3重置和跳转 git r ...

  2. git第三节----git status与git diff

    @ git status主要检索本地仓库的文件更新状态 @ git diff 主要是查看文件更新的具体内容 首先我们需要了解下文件状态类型,分为以追踪文件和未追踪文件 已追踪文件:在仓库之前的版本快照 ...

  3. git重置账号密码

    1.打开控制面板(快捷打开win+R,输入control) 2.点击打开用户账户 3.点击凭据管理器 4.点击windows凭据删除你的git凭据即可

  4. git 重置密码后,本地电脑需要修改git密码

    查看用户名git config user.name 查看密码git config user.password 查看邮箱git config user.email 修改密码git config --gl ...

  5. 对比 Git 与 SVN,这篇讲的很易懂

    ---恢复内容开始--- 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯工蜂发表于云+社区专栏 导语 本文从 Git 与 SVN 的对比入手,介绍如何通过 Git-SVN 开始 ...

  6. 用好SVN与Git,版本管理都不是问题

    介绍一下SVN SVN:代码控制器(版本控制器),主要是为了多人协同开发项目,管理代码.也可以管理个人代码.也叫程序界的”后悔药“. SVN(是subversion的简称)是近年来一款基于C/S架构的 ...

  7. Git 与 SVN对比详解

    一.Git vs SVNGit 和 SVN 孰优孰好,每个人有不同的体验. Git是分布式的,SVN是集中式的 这是 Git 和 SVN 最大的区别.若能掌握这个概念,两者区别基本搞懂大半.因为 Gi ...

  8. 用好Git 和 SVN,轻松驾驭版本管理

    用好Git 和 SVN,轻松驾驭版本管理 本文从 Git 与 SVN 的对比入手,介绍如何通过 Git-SVN 开始使用 Git,并总结平时工作高频率使用到的 Git 常用命令. 一.Git vs S ...

  9. 对比 Git 与 SVN

    一.Git vs SVN Git 和 SVN 孰优孰好,每个人有不同的体验. Git是分布式的,SVN是集中式的 这是 Git 和 SVN 最大的区别.若能掌握这个概念,两者区别基本搞懂大半.因为 G ...

随机推荐

  1. 【IOS】#import和#include有什么区别,@class呢,#import<>跟#import ""有什么区别?

    1.#import是object-c导入头文件的关键字,#include是C/c++导入头文件的关键字,使用#import导入头文件会自动只导入一次,不会重复导入. 2.@class是告诉编译器某个类 ...

  2. wrk 安装使用

    ==================== 安装 ====================https://github.com/wg/wrk/wiki sudo yum -y groupinstall ...

  3. DAY6 元组、字典与集合

    一.元组 定义:t1 = (1, 2) # t1 = tuple((1,2)) 特点:有序存储.可存放多个数据.不可变(内部可以包含可变对象,可变对象已久可变) 应用场景:将不允许操作的列表可以转化为 ...

  4. 最长公共前缀(java实现)

    题目: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow& ...

  5. [JSTL - fmt] fmt标签格式化日期

    <span ><fmt:formatDate value="${ann.adate }" pattern="yyyy-MM-dd"/>& ...

  6. dedecms 模版里格式化时间标签

    <!--带时分秒--> [field:pubdate function="GetDateTimeMK(@me)"/] <!--只有日期--> [field: ...

  7. SQL SERVER 触发器之After,Instead of

    [Ater](同for)先执行增删改操作,再执行触发器操作 [Instead of]直接只执行触发器里的 create trigger triggername on table_name for/af ...

  8. Ubuntu用android-ndk-r15c编译boost_1_65_1

    方法一(最简单的): 下载:android-ndk-r16-beta1 然后下载Boost-for-Android:https://github.com/moritz-wundke/Boost-for ...

  9. TreeTagger

    大家都知道TreeTagger是一个用于词性标注和词型还原的工具,它的返回结果由三部分组成:目标词汇,词性,原形.那该工具是怎样判断目标词汇的词性的呢?又是怎样得到目标词汇的原形的呢?本文就是从这两个 ...

  10. VSTO:使用C#开发Excel、Word【15】

    使用文档属性DocumentProperties集合和DocumentProperty对象位于Microsoft Office 11.0 Object Library(office.dll)中,该对象 ...