第三节《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 ...
随机推荐
- ShareSVN授权的代码示例
var targetUrl = "your svn url path"; var path = "Temp"; System.Collections.Objec ...
- Docker:bash: vi: command not found
在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要安装vim 操作步鄹: 1.apt-get update 2.ap ...
- 从实验室走向世界:HSP90抑制剂,一种新的癌症药物
热休克蛋白90(HSP90)是细胞内一种普遍存在的.十分保守的以及有高度活性的蛋白质,它在肿瘤细胞内的含量要比正常细胞多.作为一种分子伴侣,HSP90协助不同种类的癌蛋白(即HSP90的服务蛋白)进行 ...
- freecodecamp数字转化成罗马数字
做数字转罗马数字时,用到了贪心算法,很好用,记录一下,有时间系统的学一下 罗马数字的规则: 罗马数字网址 1 5 10 50 100 500 1000 I V X L C D M1 1当一个符号在一个 ...
- springboot启动配置原理之三(事件监听机制)
ApplicationContextInitializer public class HelloApplicationContextInitializer implements Application ...
- [Spring MVC] 表单提交日期转换问题,比如可能导致封装实体类时400错误
三种格式的InitBinder @InitBinder//https://stackoverflow.com/questions/20616319/the-request-sent-by-the-cl ...
- Median absolute deviation | Singular Value Decomposition奇异值分解 | cumulative sums |
Consider the data (1, 1, 2, 2, 4, 6, 9). It has a median value of 2. The absolute deviations about 2 ...
- Django+七牛上传+查看+下载文件相关函数,新整理未完全测试
M class File(models.Model): # 文档模型 name = models.CharField(max_length=255) staff = models.ForeignKey ...
- C# 创建对象的方法
1.实例化方法,也就是new(): //where T:new () 表示T必须有构造函数 public static T Create<T> where T:new () { retur ...
- From CSV to SQLite3 by python 导入csv到sqlite
'''初次使用SQLite,尝试把之前一个csv文件导进去,看了网上各种教程,大多是在SQLite shell模式下使用的,比较麻烦, 这里用了panda,就方便多了,仅作示例供参考. 第一篇开博,想 ...