Git 初学札记(十)—— Reset 回退的三种状态解析
引言
工作中经常会涉及到需要本地代码覆盖更新的操作。有时候可能是从远端git 上直接覆盖更新,或者是其他本地分支覆盖更新当前分支等等。这个时候就需要用到 reset 操作。
reset 操作分为三种类型:Soft、Mixed、Hard。今天我们就来说说这三种类型究竟如何使用。
一、Git 提交的三种状态
在解释 reset 的三种类型之前,我们需要了解 Git 提交的三种托管状态。不论你是用命令行,还是用图形化界面,都是如此。
第一种状态是“未暂存”、第二种状态是“已暂存”、第三种状态是“已提交”。
“未暂存”状态,是一种代码刚刚被修改过的状态。Git 不会记录你未暂存状态下多次修改之间的区别,它可以比较未暂存的代码与已提交代码之间的差异。
“已暂存”状态,是一种 Git 对修改代码进一步托管的状态,Git 管暂存区叫 Index。在 Index 区中的代码可以理解为处于一种即将提交的状态。
“已提交”状态,是一种 Git 对修改代码完成追踪的状态,Git 会记录本次提交,同时在时间线上生成一条 commit 记录,每条 commit 记录都会有一个唯一的 commit Id 。
如何理解提交的三种状态?我们可以以电商购物为例,来打个比方:
当我们浏览到我们喜欢的商品,给他们添加了一些备注或者将他们收藏,可以理解为一种简单的修改,那么此时,该商品已经处于“未暂存”状态。
如果我们对收藏的商品情有独钟,我们可以将 购物车理解为 暂存区(Index),将商品加入购物车的操作就可以理解为将修改代码添加到暂存区,此时商品就处于“已暂存”状态。
终于,我们下定决心购买这件商品,填写了必要的购买信息,比如电话、收货地址等后,点击付款,于是商品就处于了一种“已提交”的状态,并生成了一条订单号,可以类比我们的 commit id。
针对图形化的界面,如 Eclipse 中的 Git 插件,我们可以看到这样的区域:
二、Reset 三种类型
Reset 需要有一个参考标准,可以是本分支的其他提交点,也可以是本地其他分支的提交点,也可以是远程分支上的提交点。
比如,如果你希望直接将远程分支直接覆盖到本地,那么reset 的参考系就是远程分支上的最新一次 提交点。
当我们打开 Reset 对话框,可以看到我们需要选择的参考系,我们此时可以选择远程分支的最新提交点作为 reset 的参考系,在选择 Reset type 的时候,有三种选项:
Soft ,意思是只回退 HEAD 指针,HEAD 指针是 Git 在提交时间线上的某一个 提交点,一般而言,HEAD 和最新的提交是一致的。因为 git 有三级提交机制,因此 Soft 只回退 HEAD 的话,会回退与参考系提交点不同的所有提交记录,但暂存区和未暂存区会保留全部修改,同时被回退的提交记录中的所有修改会全部回退到暂存区。可以将 Soft 简单理解为将所有提交退回到暂存区,所有修改都会保留。
Mixed,意思是回退 HEAD 和 暂存区。即与参考提交点不同的所有提交,以及所有暂存区中未提交的修改,会全部回退到未暂存区。这是比较常用的 Reset 类型,它既会保留你的全部修改,同时又统一回退到所有代码“未暂存”状态。
Hard ,意思是强制回退或覆盖本地全部代码。这种回退类型不仅会回退与参考提交点不同的全部提交的代码,同时也会回退暂存的和未暂存的代码,将本地的全部代码与参考提交点完全保持一致,并且抛弃所有修改,不做保留。一般如果想直接覆盖本地代码,就可以选择 Hard 类型来操作。
总结
Reset 三种类型包括 Soft、Mixed、Hard。
从回退的力度来讲 Soft —> Mixed—> Hard 依次加重,分别对应
回退“已提交”—> 回退“已提交+已暂存”—> 回退“已提交+已暂存+未暂存” 。
两种常用场景:
1、如果想回退所有本地与远程不同的 commit ,同时又保留所有修改,可以选择 Soft 或 Mixed,推荐 Mixed。
2、如果想覆盖或回退本地代码,又不需要保留任何本地修改,可以选择 Hard 。
Git 初学札记(十)—— Reset 回退的三种状态解析相关推荐
- Git初学札记(七)————合并分支(merge)
目录 引言 开始Merge 1.History视图 2.Team菜单 3.Git Repositories视图 巧用Git Staging视图 放弃Merging 可能的Merge结果 引言 Git鼓 ...
- git中文件的三种状态
用xcode的时候,左侧栏文件的邮右边时不时会看到M,A这一类的字母.当然,这些以后再写上.先说一下git里文件的三种状态 已提交(committed) 已经提交的本地仓库(repository), ...
- Activity生命周期的三种状态
生命周期就是一个对象从创建到销毁的过程,每一个对象都有自己的生命周期.同样,Activity也具有相应的生命周期,Activity的生命周期中分为三种状态,分别是运行状态.暂停状态和停止状态.接下来将 ...
- 敏捷悖论之:站会的三种状态
敏捷的诡异之处,在于大家讲的可能是同一套术语,但意义不可同日而语. 科层制与敏捷之下,张力.挑战.担当,术语相同,含义不可同日而语.传统是适应领导,敏捷是适应团队.传统是适应领导,敏捷是适应型领导.敏 ...
- 举例理解Hibernate的三种状态:瞬时态、持久态、托管(即游离态)态及互相转化
举例理解Hibernate的三种状态 初学Hibernate,了解到Hibernate有三种状态:transient(瞬时状态),persistent(持久化状态)以及detached(游离状态). ...
- CPU被夺走的三种状态 执行时间久了 IO操作让cpu等待 被优先级高的抢占
CPU被夺走的三种状态 . cpu的三种状态之 运行态 就绪态等待被调用 阻塞态 i ...
- AntD Checkbox 的三种状态处理
对于单个 Checkbox 来说,只有两种值:选中 (checked) 或未选中 (unchecked) . 但对于 Checkbox Group 来说,却有三种值:全选 (checked) .部分选 ...
- 【SSH】——Hibernate三种状态之间的转化
Hibernate的三种状态为:transient.persistent和detached.对这三种状态的理解可以结合Session缓存,在Session缓存中的状态为persistent,另外两种不 ...
- Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用
Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...
最新文章
- 【设计模式】三大类:创建型模式、结构型模式、行为型模式
- 感觉没有学会什么真正的本领
- 网络通信-2(TCP通信、ServerSocket、Socket)
- ubuntu中解决无法调节屏幕亮度的问题
- 5912. 每一个查询的最大美丽值
- php 源文件加密工具PHP Screw
- 使用trycatch获取异常问题
- python画雷达图-python使用matplotlib绘制雷达图
- SQL语句:查询语句及多表查询典型例子
- smart原则_目标管理:OKR与SMART原则的异同
- Spring boot 集成极光推送
- word 添加手写签名
- 关于贴片机如何获取元件的位置思考
- Angular:失焦校验和失焦方法冲突的解决方案 事件循环
- ORACLE-EBS常用表
- 软考初级信息处理技术员基础知识考点(建议收藏)
- Arduino、AB相增量式光电编码器测位移和速度方向
- Echarts 当Y轴取值存在正负值的时候,x轴文字与x轴贴合(不在底部显示)
- 电脑蓝屏原因?及其解决办法
- 一句Json搞定数组中多层字段的替换