[Git] 009 逆转未来
1. 想逆转未来,得先知道时间线
1.1 git log
1.2 git log --oneline
- 此命令的显示结果比
git log
简洁
1.3 git reflog
- 此命令显示的记录比前两者完整
2. 哨兵来了,不是,是任务来了
2.1 查看状态
分析
当前处于 "master" 分支
暂存区的文件均已提交至本地仓库,即,此时暂存区的内容与本地仓库指向的版本的内容一致
提示
命令:
git checkout -- <file>
作用:舍弃更改,即,用暂存区的内容覆盖工作区
- 红色的 "modified" 似曾相识
- [Git] 008 status 与 commit 命令的补充 的 "1.8" 有提及
git status -s
回馈的红色的 "m" 就是指 "modified"- 这里说明工作区的 "README.md" 与 "note_01.txt" 产生了变动
提示中最后一行表明
git add
与git 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"
git diff --cached <file>
可以比较暂存区的 "file" 与本地仓库的 "file" 的不同- [Git] 007 三棵树以及向本地仓库加入第一个文件 的 "2.5" 有提到过 "--cached"
分析
上一次提交后,暂存区与本地仓库的内容并没有变动
即,暂存区与本地仓库当前版本的 "note_01.txt" 是一样的
3.3 换参数 "HEAD"
git diff HEAD <file>
可以比较工作区的 "file" 与本地仓库中当前版本的 "file" 的不同
分析
- 工作区的 "file" 与本地仓库中当前版本的 "file" 的相同
- 其实从 "2.1" 分析的第 2 条也可以看出
- 暂存区的内容提交到了本地仓库,=> 暂存区与本地仓库的当前版本一致
- 又,暂存区回滚给了工作区
- => 此时“三棵树”是一致的
- 当然,从 "2.2" 的图也可看出
- nothing to commit, working tree clean
- 又,工作区没有变动
- => 此时“三棵树”是一致的
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 几个注意点
- 时光是倒流了,但无情的岁月会拿小本本写下咱们的“开挂记录”
- "~" 和 "^" 可以累加
- 如果记录够多,
git reset --hard HEAD~~
可以回到上上个版本,以此类推 - 也可以用
git reset --hard HEAD~10
,相当于依次往前回滚 10 下
- 如果记录够多,
git reset --hard HEAD
,虽没效果,也算一次记录- 保险起见还是先 "reflog",再用哈希值回滚
- 还可以用“指针”回滚,具体见 [Git] 010 对 [Git 008] 的补充:实现 commit 不计次数 的 "10"
[Git] 009 逆转未来的更多相关文章
- [Git] 024 log 命令的补充
0. 回顾 [Git] 009 逆转未来 的 "1" 画张导图 其实 --oneline 前有个"关键字参数" "--pretty" --o ...
- [Git] 017 加一条分支,享双倍快乐
0. 回顾 [Git] 009 逆转未来 中的 "2.2" 讲过 git checkout -- <file> 这回的 git checkout <branch_ ...
- [Git] 007 三棵树以及向本地仓库加入第一个文件
1. "三棵树" 1.1 前言 理论上要稍稍复杂一点 我在这里说得简化一点 顺道挖个坑 下回具体介绍 坑号编码:Git07-1 1.2 看图 1.3 简介 树左:工作区(平时写代码 ...
- 前端学习之路——Git篇
本文只是一个个人学习Git的笔记,如有错误的地方,还望指出,谢谢!参考资料如下: <Git教程--廖雪峰的官方网站 > bootstrap里面的--git_guide Git安装 在网上搜 ...
- GIT分布式版本控制系统
Git诞生历史 我想大家还记得Linus torvalds在1991年时发布了Linux操作系统吧,从那以后Linux系统变不断发展壮大,因为Linux系统开源的特性,所以一直接受着来自全球Linux ...
- git操作
svn终结,git时代来临 git是最好的分布式版本控制系统 廖雪峰的git讲的蛮不错,http://www.liaoxuefeng.com/wiki/0013739516305929606dd183 ...
- git 用法
git init #创建仓库git add _filename #添加文件到缓冲区git commit -m "msg" #提交更新,从缓冲区提交到版本库git status #查 ...
- git的入门使用操作
Git html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,addres ...
- [Tool] Git 使用 与 Git Flow
目录 简介 Git 命令 Git Flow 简介 Git是目前世界上最先进的分布式版本控制系统(没有之一). Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Lin ...
随机推荐
- JavaScript设计模式 样例二 —— 策略模式
策略模式(Strategy Pattern): 定义:定义了一族算法: 封装了每个算法: 这族的算法可互换代替. 目的:将算法的使用与算法的实现分离开来. 场景:可用来消除大量的条件分支语句. 例:J ...
- u-boot-2016.09 make编译过程分析(一)
https://blog.csdn.net/guyongqiangx/article/details/52565493 综述 u-boot自v2014.10版本开始引入KBuild系统,Makefil ...
- vi编辑器的快捷键汇总
光标控制命令 本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027& ...
- Keras get Tensor dimensions
int_shape(y_true)[0] int_shape(y_true)[1]
- GDOI2016总结
前言 第一次GDOI,收获了很多. 这几天下来的生活有趣而精彩,尽管我没有高级的腐败工具,但是还是通过偷抢拐骗各种方法满足了腐败的欲望了. BUT,参加GDOI可不是为了玩耍,而是去提升自己的实力,磨 ...
- vue 常见错的可能原因
标签或者组件名写错 Unknown custom element: <h> - did you register the component correctly? For recursiv ...
- 交互输入与for语句
交互输入与for语句 1. 交互输入 read命令可以同时定义多个变量值:输入的内容默认以空格为分隔符,将值输入到对应的变量中:read尽量避免交互 如果默认值过多,最后所有的值会被赋予给最有一个 ...
- 总结PHP缓存技术的多种方法
这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓 ...
- linux 阿里云oss命令ossutil64 同步文件
官方使用文档: https://help.aliyun.com/document_detail/120057.html?spm=a2c4g.11186623.4.2.1c35448ak8Ez8e [r ...
- Nginx动静分离-tomcat
一.动静分离 1.通过中间件将动态请求和静态请求分离. 2.为什么? 分离资源,减少不必要的请求消耗,减少请求延时. 3.场景 还可以利用php,fastcgi,python 等方式 处理动态请求 # ...