1. 想逆转未来,得先知道时间线

1.1 git log

1.2 git log --oneline

  • 此命令的显示结果比 git log 简洁

1.3 git reflog

  • 此命令显示的记录比前两者完整

2. 哨兵来了,不是,是任务来了

2.1 查看状态

分析

  1. 当前处于 "master" 分支

  2. 暂存区的文件均已提交至本地仓库,即,此时暂存区的内容与本地仓库指向的版本的内容一致

  3. 提示

    • 命令:git checkout -- <file>

    • 作用:舍弃更改,即,用暂存区的内容覆盖工作区

  4. 红色的 "modified" 似曾相识
  5. 提示中最后一行表明 git addgit commit -a 有相同的效果

补充

  • "Git" 中常见的三种状态

    • "modified" 已修改
    • "staged" 已暂存
    • "committed" 已提交

2.2 git checkout -- <file>

  • 虽说这条命令要少用,做实验嘛,不妨用一下
  • <file> 可以是多个文件,用空格隔开即可

2.3 查看一下

分析

  • 回顾:[Git] 008 status 与 commit 命令的补充 的 "2.4"
  • "README.md"
    • 空白的原因:我建好 "README.md" 后没有添加文本就提交了,之后没有变动
    • "2.1" 中 "modified" 的原因:我把工作区的 "README.md" 变动了
  • "note_01.txt" 少了一句 4. git commit -m "<message>" 加入仓库,请往下看

3. git diff 登场

3.1 git diff <file>

  • 可以比较工作区的 "file" 与暂存区的不同

分析

  • 因为 "2.2" 的操作,此时工作区的文件是从暂存区回滚过来的
  • 两者一样,所以没有回馈

3.2 加参数 "--cached"

分析

  • 上一次提交后,暂存区与本地仓库的内容并没有变动

  • 即,暂存区与本地仓库当前版本的 "note_01.txt" 是一样的

3.3 换参数 "HEAD"

  • git diff HEAD <file> 可以比较工作区的 "file" 与本地仓库中当前版本的 "file" 的不同

分析

  • 工作区的 "file" 与本地仓库中当前版本的 "file" 的相同
  • 其实从 "2.1" 分析的第 2 条也可以看出
    1. 暂存区的内容提交到了本地仓库,=> 暂存区与本地仓库的当前版本一致
    2. 又,暂存区回滚给了工作区
    3. => 此时“三棵树”是一致的
  • 当然,从 "2.2" 的图也可看出
    1. nothing to commit, working tree clean
    2. 又,工作区没有变动
    3. => 此时“三棵树”是一致的

3.4 "HEAD" 升级

  • 利用 "1.3" 的图中的哈希值代替 "HEAD" 可以使工作区的 "file" 与本地仓库以往版本的 "file" 比较

  • 如,我要与 HEAD@{3} 比较

分析

  • 工作区的 "note_01.txt" 与本地仓库中版本号为 "9884432" 的 "note_01.txt" 有区别

    • 2. git status 查看 下方多了两行

3.5 继续升级

  • 有了哈希值做 "id",可以比较的东西就多了
  • git diff --chcaed <id> <file> 让暂存区的 "file" 与本地仓库以往版本的 "file" 进行比较

  • git diff <id1> <id2> <file> 让本地仓库中不同版本的 "file" 进行比较

分析

  • 绿色语句以 "+" 开头,说明增加了 xxx
  • 红色语句以 "-" 开头,说明减少了 xxx
  • 这里是以 <id2> 为“对照组”,<di1> 为“实验组”
    • <id2> 是比较的基准
    • <id2> 比 <id1> 多了/少了 xxx
  • <id1> 与 <id2> 换一下顺序,结果会变

补充:可以使用 "HEAD@{n}" 代替哈希值

3.6 "diff" 小结

  • 在网上寻得一张关于 "diff" 的图片,我就不重复造轮子了

4. 说好的“逆转未来”呢

4.1 先说原因

  • "2.3" 的第一张图中理应有 4. git commit -m "<message>" 加入仓库 这句话
  • 这句话并不是消失了,而是当初就没存在过
  • [Git] 008 status 与 commit 命令的补充 的 "2.4" 光顾着 "commit",但 "commit" 之前没有 "add"

4.2 出来把,时光机!

  • git reset --hard HEAD~

4.3 如果后悔了,可以利用 "id" 再回来

  • git reset --hard <id>

  • "id" 可以不写全

    • 上图就是,而且还可以再缩
    • 前提是缩写后的值是“唯一”的
  • "reflog" 在这里很有用

4.4 时光不能倒流,但是 "Git" 可以

  • git reset --hard HEAD^

  • 有些版本的 "^" 需要加引号,如

    • git reset --hard HEAD"^"

4.5 几个注意点

  1. 时光是倒流了,但无情的岁月会拿小本本写下咱们的“开挂记录”

  1. "~" 和 "^" 可以累加

    • 如果记录够多,git reset --hard HEAD~~ 可以回到上上个版本,以此类推
    • 也可以用 git reset --hard HEAD~10,相当于依次往前回滚 10 下
  2. git reset --hard HEAD,虽没效果,也算一次记录
  3. 保险起见还是先 "reflog",再用哈希值回滚
  4. 还可以用“指针”回滚,具体见 [Git] 010 对 [Git 008] 的补充:实现 commit 不计次数 的 "10"

[Git] 009 逆转未来的更多相关文章

  1. [Git] 024 log 命令的补充

    0. 回顾 [Git] 009 逆转未来 的 "1" 画张导图 其实 --oneline 前有个"关键字参数" "--pretty" --o ...

  2. [Git] 017 加一条分支,享双倍快乐

    0. 回顾 [Git] 009 逆转未来 中的 "2.2" 讲过 git checkout -- <file> 这回的 git checkout <branch_ ...

  3. [Git] 007 三棵树以及向本地仓库加入第一个文件

    1. "三棵树" 1.1 前言 理论上要稍稍复杂一点 我在这里说得简化一点 顺道挖个坑 下回具体介绍 坑号编码:Git07-1 1.2 看图 1.3 简介 树左:工作区(平时写代码 ...

  4. 前端学习之路——Git篇

    本文只是一个个人学习Git的笔记,如有错误的地方,还望指出,谢谢!参考资料如下: <Git教程--廖雪峰的官方网站 > bootstrap里面的--git_guide Git安装 在网上搜 ...

  5. GIT分布式版本控制系统

    Git诞生历史 我想大家还记得Linus torvalds在1991年时发布了Linux操作系统吧,从那以后Linux系统变不断发展壮大,因为Linux系统开源的特性,所以一直接受着来自全球Linux ...

  6. git操作

    svn终结,git时代来临 git是最好的分布式版本控制系统 廖雪峰的git讲的蛮不错,http://www.liaoxuefeng.com/wiki/0013739516305929606dd183 ...

  7. git 用法

    git init #创建仓库git add _filename #添加文件到缓冲区git commit -m "msg" #提交更新,从缓冲区提交到版本库git status #查 ...

  8. git的入门使用操作

    Git html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,addres ...

  9. [Tool] Git 使用 与 Git Flow

    目录 简介 Git 命令 Git Flow 简介 Git是目前世界上最先进的分布式版本控制系统(没有之一). Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Lin ...

随机推荐

  1. GUI学习之二十五——QFontDialog学习总结

    今天学习字体对话框——QFontDialog()控件. QFontDialog()是继承自QDialog()的一个子类,用来选择给定的字体(包括字体.字号.样式等) 一.构造函数 QFontDialo ...

  2. shell字符串拼接

    name="Shell" url="http://c.biancheng.net/shell/" str1=$name$url #中间不能有空格 str2=&q ...

  3. MyEclipse XML & XML架构教程:XML Schema (XSD)编辑器

    [MyEclipse CI 2019.4.0安装包下载] 1. MyEclipse中的XSD编辑 本文档介绍MyEclipse XML Schema(XSD)编辑器中的一些可用函数.XML Schem ...

  4. 负载均衡(二)DNS负载均衡

    一.DNS原理及解析过程详解 相信大家在平时工作中都离不开DNS解析,DNS解析是互联网访问的第一步,无论是使用笔记本浏览器访问网络还是打开手机APP的时候,访问网络资源的第一步必然要经过DNS解析流 ...

  5. vue-cli项目中引入全局scss

    加载一个全局设置文件 在每个组件里加载一个设置文件,而无需每次都将其显式导入,是一个常见的需求.比如为所有组件全局使用 scss 变量.为了达成此目的: npm install sass-resour ...

  6. 【01】Python 环境变量、条件判断、循环、基本运算符

    1 环境变量 1.1 Windows下环境变量 系统变量Path中要加入Python安装路径: C:\xxxx\Python36;C:\xxxx\Python36\Scripts; 2 条件判断 2. ...

  7. <el-menu>菜单标签(里面可以包括:<el-submenu>和<el-menu-item>)

    <el-menu> 1.router属性,若使用router属性menu-item的index将对应router的path属性 2.mode,下拉菜单的模式分为horizontal和ver ...

  8. node创建项目,要ejs模板引擎,不要jade怎么办?

    创建项目时:express ejs blog,生成的是.jade文件怎么办?我想要的是ejs的呀 上述语句不仅名字不对,生成文件的格式也不是我想要的. 不妨试试:express -e blog 这下就 ...

  9. Android开发实践:Android.mk模板

    关于Android NDK开发的文章已经比较多了,我的博客中也分享了很多NDK开发相关经验和技巧,今天简单写了一个 Android.mk 的示例模板,供初学者参考. 本模板主要给大家示例 Androi ...

  10. 软件工程 in MSRA 第一周博客作业

    1. 自我介绍 大家好-我是陈海峰,哈尔滨工业大学计算机学院的一名大四学生,大四开始在 MSRA 的 KC 组进行实习.作为一个标准的"肥宅",对运动没什么兴趣的我,主要的兴趣点就 ...