第三节《Git重置》
先来看看.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重置》的更多相关文章
- 完整学习git五git重置
git重置命令的一个用途就是修改引用的游标指向 1查看git操作日志 git reflog 2查看当前head游标的指向 cat .git/refs/heads/master 3重置和跳转 git r ...
- git第三节----git status与git diff
@ git status主要检索本地仓库的文件更新状态 @ git diff 主要是查看文件更新的具体内容 首先我们需要了解下文件状态类型,分为以追踪文件和未追踪文件 已追踪文件:在仓库之前的版本快照 ...
- git重置账号密码
1.打开控制面板(快捷打开win+R,输入control) 2.点击打开用户账户 3.点击凭据管理器 4.点击windows凭据删除你的git凭据即可
- git 重置密码后,本地电脑需要修改git密码
查看用户名git config user.name 查看密码git config user.password 查看邮箱git config user.email 修改密码git config --gl ...
- 对比 Git 与 SVN,这篇讲的很易懂
---恢复内容开始--- 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯工蜂发表于云+社区专栏 导语 本文从 Git 与 SVN 的对比入手,介绍如何通过 Git-SVN 开始 ...
- 用好SVN与Git,版本管理都不是问题
介绍一下SVN SVN:代码控制器(版本控制器),主要是为了多人协同开发项目,管理代码.也可以管理个人代码.也叫程序界的”后悔药“. SVN(是subversion的简称)是近年来一款基于C/S架构的 ...
- Git 与 SVN对比详解
一.Git vs SVNGit 和 SVN 孰优孰好,每个人有不同的体验. Git是分布式的,SVN是集中式的 这是 Git 和 SVN 最大的区别.若能掌握这个概念,两者区别基本搞懂大半.因为 Gi ...
- 用好Git 和 SVN,轻松驾驭版本管理
用好Git 和 SVN,轻松驾驭版本管理 本文从 Git 与 SVN 的对比入手,介绍如何通过 Git-SVN 开始使用 Git,并总结平时工作高频率使用到的 Git 常用命令. 一.Git vs S ...
- 对比 Git 与 SVN
一.Git vs SVN Git 和 SVN 孰优孰好,每个人有不同的体验. Git是分布式的,SVN是集中式的 这是 Git 和 SVN 最大的区别.若能掌握这个概念,两者区别基本搞懂大半.因为 G ...
随机推荐
- JS函数、变量作用域
函数参数 函数的()中指定一个或多个形参(形式参数),多个形参之间用,号隔开,声明形参相当于在函数内部声明了对应的变量,但不赋值.在调用时在()中指定实参 调用时解析器不会检查实参类型.数量,实参可 ...
- Java内存可见性
如果一个线程对共享变量的修改,能够被其它线程看到,那么就能说明共享变量在线程之间是可见的.如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量.Java内存模型(Java ...
- 简单的class及运算符重载
#include <iostream> #include <vector> #include <algorithm> using namespace std; cl ...
- centos的防火墙相关
在服务器上启动了node服务,但是外面访问不到, 原因是防火墙没开端口,新装的机器,也没有iptables systemctl stop firewalld yum install iptables- ...
- 百度echarts 3.0版本和2.0版本的兼容问题
前一段时间,项目中要用到统计图表,之前也用过jqplot的图表插件,这次开发的内容中基于地图的展示还很多,所以后来选择了百度的echarts插件(echarts.baidu.com).刚开始用的时候, ...
- 『Numpy』内存分析_numpy.dtype解析内存数据
numpy.dtype用于自定义数据类型,实际是指导python程序存取内存数据时的解析方式. [注意],更改格式不能使用 array.dtype=int32 这样的硬性更改,会不改变内存直接该边解析 ...
- volatile关键字的作用
引言:以前只是看过介绍volatile的文章,对其的理解也只是停留在理论的层面上,由于最近在项目当中用到了关于并发方面的技术,所以下定决心深入研究一下java并发方面的知识.网上关于volatile的 ...
- 两个非空的<div>元素inline-block化后出现空白部分解决办法
在涉及到两个<div>元素并列显示的效果时,一般有两种方法: 1.使用float元素让元素并联显示: 2.将块状的<div>元素display设置为inline-block,使 ...
- es6中...是什么意思。
1. var set = new Set([1, 2, 3, 4, 4,4,4,4,2,2,2]) set=[...set] 2. let [head, ...tail] = [1, 2, 3, 4] ...
- mycat 入门使用例子
目的:有 user 和 t_order 两张数据表,表 user 的数据全部存放在 db1_zhang 中,表 t_order 的数据按 id 对 2 取模分别存放在 db1_zhang 和 db2_ ...