先来看看.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. Qt打开文件对话框同时选中多个文件或单个文件

    Qt中打开单个文件 //str_path为文件路径 QString str_path = QFileDialog::getOpenFileName(this, tr("选择转码文件" ...

  2. WIN8外包公司—长年承接WIN8(surface)应用外包—北京动点飞扬软件

    WIN8外包公司—长年承接WIN8(surface)应用外包 一.我们长年专门承接WIN8外包.Surface外包. WPF 外包.HTML5外包.WindowsPhone 外包.Silverligh ...

  3. 如何隐藏Excel中单元格公式且其他单元格可修改

    需求:1.隐藏指定单元格公式.2.非公式单元格可修改,不影响公式计算. 操作步骤:1.全选工作表.右键.单元格格式.保护.锁定勾选取消. 2.编辑.定位(或按F5弹出该对话框).定位条件.公式(勾选) ...

  4. CSS font-family字体大合集

    在写文字内容占大篇幅的页面是,总是会面临着改变字体的需求,以下为font-family常用合集以及一部分文字效果: windows常见内置中文字体 字体中文名             字体英文名    ...

  5. SQL列转行用逗号隔开

      declare @result varchar(255) set @result = ” select @result = @result + cast(F_IT_FWID as varchar( ...

  6. 【框架】selenium网页端的基本自动化框架(四)

  7. python之路--迭代器和生成器

    迭代: 迭代器协议: 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...

  8. C语言与C++语言的强制类型转换格式区别

    C语言:(类型)(表达式),其中类型的括号()必须带. C++语言:(类型)(表达式),其中类型的括号()跟进表达式选带.

  9. C++ allocator

    C++ allocator http://www.cnblogs.com/wpcockroach/archive/2012/05/10/2493564.html 说一说C++里的allocator.我 ...

  10. noj电子老鼠走迷宫(深搜dfs)超时错误

    1042.电子老鼠闯迷宫 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色 ...