先来看看.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. JavaScript形而上的单例模式

    什么是单例模式? 单例模式是指,类多次实例化返回的对象是同一个. 反例 var tt = function(name){ this.name = name; }; var t1 = new tt('t ...

  2. 最短路计数——Dijkstra

    题目: 给出一个N个顶点M条边的无向无权图,顶点编号为1−N.问从顶点1开始,到其他每个点的最短路有几条. ——传送门 受到题解的启发,用 Dijkstra A掉(手工代码) 思路: 1.无向无权图, ...

  3. DAY9 函数

    一.脚本文件的执行 1.存放当前文件作为脚本文件执行的参数们:[‘当前文件的绝对路径’,手动传入的参数们] 2.脚本文件执行:直接用python解释器运行该文件  print(sys.argv) # ...

  4. Yahoo Programming Contest 2019 E - Odd Subrectangles

    E - Odd Subrectangles 思路: 对于行方案固定的情况下,假设和为奇数的列为a个,和为偶数的列为b个,a+b = m 那么从奇数里面选奇数个,即C(a, 1) + C(a, 3) + ...

  5. [flask]gunicorn配置文件

    配置文件 #!/home/xx/.virtualenvs/xx/bin/python # encoding: utf-8 import multiprocessing # 监听端口 bind = '0 ...

  6. Java实现将文件或者文件夹压缩成zip

            最近碰到个需要下载zip压缩包的需求,于是我在网上找了下别人写好的zip工具类.但找了好多篇博客,总是发现有bug.因此就自己来写了个工具类.         这个工具类的功能为: ( ...

  7. ubuntu 16.04 的IP地址变更

    网上google 出来的,全是让你变更 /etc/network/interfaces 这个文件. 可是,我以前设置过的静态地址,全没反映在这个文件里. 这回再变更的话,肯定也不是这个. 然后进入/e ...

  8. php 截取 小程序上传到服务器图片,

    截取字符串传入数据库 $f_slide = htmlspecialchars_decode($_REQUEST['f_slide']); // echo "<pre>" ...

  9. wincc项目移植和复制解决办法

    wincc项目复制 wincc项目不支持直接复制,部分的后台数据库在活跃状态,直接复制wincc项目,会提示跳过活跃状态的数据库,当跳过活跃数据库时,复制的项目也是无效的.在wincc项目管理器中打不 ...

  10. Cassandra.yaml 配置详解

    cluster_name 设置Cassandra集群的名称. 在Cassandra集群中,每一台服务器都必须具备相应的集群的名称.如果名称不一致,则当前Cassandra服务器无法加入集群. init ...