详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别...

一、可以将git简单的分为三个区域 
   1、工作区(working directory) 
   2、暂缓区(stage index) 
   3、历史记录区(history)    
如图: 



 其中git add files 把当前工作目录中的文件放入暂存区域 

    这其实做了两件事: 
    1、将本地文件的时间戳、长度,当前文档对象的id等信息保存到一个树形目录中去(index,即平时说的暂存区) 
    2、将本地文件的内容做快照并保存到Git 的对象库 。
   

       综上2点来说,暂存区实际上就是一个包含文件索引的目录树,像是一个虚拟的工作区。在这个虚拟工作区的目录树中,记录了文件名、文件的状态信息(时间戳、文件长度等),文件的内容并不存储其中,而是保存在 Git 对象库(.git/objects)中,文件索引建立了文件和对象库中对象实体之间的对应。 
    如图:



   在这个图中,我们可以看到部分 Git 命令是如何影响工作区和暂存区(stage, index)的: 
   图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。 
   图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个“游标”。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。 
   图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下 
   当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID 被记录在暂存区的文件索引中
   当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树  。

    当执行 "git status" 命令扫描工作区改动的时候,先依据 .git/index 文件中记录的(工作区跟踪文件的)时间戳、长度等信息判断工作区文件是否改变。如果工作区的文件时间戳改变,说明文件的内容可能被改变了,需要打开文件,读取文件内容,和更改前的原始文件相比较(本地文件和与之对应的object库中的文件的内容进行对比),判断文件内容是否被更改。如果文件内容没有改变,则将该文件新的时间戳记录到 .git/index 文件中。因为判断文件是否更改,使用时间戳、文件长度等信息进行比较要比通过文件内容比较要快的多,所以 Git 这样的实现方式可以让工作区状态扫描更快速的执行,这也是 Git 高效的因素之一。 

     git diff files用来进行具体文件的变动对比,通常用来进行工作区与暂存区之间的对比,实质上是用 git objects 库中的快照与工作区文件的内容的对比。 

 

另外,Git中提供了几个相关的撤销操作的命令,如git reset、git revert、git checkout,这几者之间的用法各有不同。

 

 

二、git reset的用法

从上图可知:git reset -- files 用来撤销最后一次的git add files(因为每git add file一次,暂存区的文件都会被更改一次),你也可以用git reset 撤销所有暂存区域文件。 

另外:

 一、git reset的用法:git reset + commit号

1、git reset命令后面需要加2种参数:"--hard"和"--soft",如果不加,默认情况下是"--soft"。

2、--soft表示该条commit号之后(时间作为参考点)的所有commit的修改都会退回到git缓冲区中。所以使用git status命令可以在缓冲区中看到这些修改。

3、"--hard"则表示缓冲区中不会存储这些修改,git会直接丢弃这部分内容,但需要注意的一个问题是:这样的重置是直接在本地的修改,无法提交到远程服务器,如果直接丢弃的内容已经被推到远程服务器上了,则会造成本地和服务器无法同步的问题,即git reset --hard只能针对本地操作,不能针对远程服务器进行同样操作。如果从本地删掉的内容没有推到服务器上,则不会有副作用,如果被推到服务器,则下次本地和服务器进行同步时,这

部分删掉的内容仍然会回来。

(其实这个问题则可以很好的被git revert 命令解决,使用git revert + commit号,该命令撤销对某个commit的提交,这一撤销动作会作为一个新的修改存储起来,这样,当你和服务器同步时,就不会产生什么副作用。)

 

其实在merge的时候,也有可能会用到git reset.

如果我们当前使用git pull的时候,可能会出现merge冲突,在冲突状态下,需要解决冲突的文件会从index暂存区打回到工作区。

如果有冲突的时候,一般用如下步骤解决冲突:

1、用工具或者手工解决冲突 

2、git add 命令来表明冲突已经解决。 

3、再次commit已解决冲突的文件。

这当中,可以使用git reset --hard ORIG_HEAD用来撤销已经commit的merge. 

使用git reset --hard HEAD 用来撤销还没commit 的merge,其实原理就是放弃index和工作区的改动。

也可以使用git reset --merge ORIG_HEAD,注意其中的--hard 换成了 --merge,这样就可以避免在回滚时清除working tree。

 

三、git checkout的用法

       从上图可知,git checkout -- files 把文件从暂存区域复制到工作目录,用来丢弃本地修改。 需要另外注意的是:

       1、当执行 "git rm --cached <file>" 命令时,会直接从暂存区删除文件,工作区则不做出改变。
       2、当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动 

       3、当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动  。

 

四、git revert的用法

        git revert 也是撤销命令,区别在于reset是指向原地或者向前移动指针,git revert是创建一个commit来覆盖当前的commit,指针向后移动。

 那么两者的具体区别有:

1)git revert 是撤销某次操作,此次操作之前的commit都会被保留,而git reset 是撤销某次提交,但是此次之后的修改都会被退回到暂存区中。

具体一个例子,假设有三个commit(commit1,commit2,commit3),使用 git status:

commit3: add test3.c

commit2: add test2.c

commit1: add test1.c

 

当执行git revert HEAD~1时(撤销倒数第二个操作),第二个操作即commit2这个操作被撤销了,使用git log可以看到:

commit1:add test1.c

commit3:add test3.c

由于git revert不会回退到暂存区中,所以使用git status 没有任何变化

 

如果换做执行git reset --soft(默认) HEAD~1后,运行git log可以看到

commit2: add test2.c

commit1: add test1.c

运行git status,可以看到test3.c处于暂存区了,准备提交。

 

但如果换做执行git revert后,

显示:HEAD is now at commit2,运行git log可以看到

commit2: add test2.c

commit1: add test1.c

运行git status, 则没有任何变化

 

所以,git revert与git reset最大的不同是,git revert 仅仅是撤销某次提交,而git reset会将撤销点之后的操作

都回退到暂存区中。

 

1、git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。 

2、在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。

因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。 

3、git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

 

 

六、不得不提的git的其它删除命令(类似于Linux的命令):

git rm --cached readme.txt 只从缓存区中删除readme.txt,保留物理文件

 

git rm readme.txt 不但从缓存区中删除,同时删除物理文件

 

git mv a.txt b.txt 把a.txt改名为b.txt

 

 

综上所以我们有时如果是想撤销对单个文件的更改:

<->、如果已经用add命令把文件加入stage暂存区了:

1、就先需要从stage暂存区中撤销:

"git reset HEAD <file>..." 

2、然后再从工作区撤销,即将暂存区的文件替换工作区当前的文件

"git checkout -- <file>..." to discard changes in working directory

如:git checkout a.txt  撤销a.txt的变动(工作区上的文件) 

如果是多个文件:git chenkout .

 

<二>、如果已经commit了,则需要 

1、使用git commit --amend来进行修改,这个只能修改最近一次的,也就是用一个新的提交来覆盖上一次的提交。因此如果push以后再做这个动作就会有危险。

2、git reset --hard HEAD 放弃工作区和index的改动,HEAD指针仍然指向当前的commit.(参照第一幅图)

这条命令同时还可以用来撤销还没commit的merge,其实原理就是放弃index暂存区和工作区的改动,因为没commit的改动只存在于index暂存区和工作区中。

而git reset --hard HEAD^ 用来撤销已经commit的内容(等价于 git reset --hard HEAD~1) 。原理就是放弃工作区和index的改动,同时HEAD指针指向前一个commit对象。

5分钟搞定!用ZLMediaKit搭建GB28181视频监控系统(含避坑指南) 本文提供了一份基于ZLMediaKit搭建GB28181视频监控系统的实战指南。文章详细介绍了从环境准备、核心组件(ZLMediaKit与SIP服务器)部署、摄像头配置到内外网穿透的完整流程,并重点分享了设备ID配置、防火墙设置等关键避坑经验,帮助开发者快速构建稳定可控的监控平台。 阅读详情

相关推荐

NC数据预处理避坑指南:从MATLAB读取到GeoTIFF导出,解决坐标翻转与值域异常

本文详细解析了NC数据预处理中的常见问题,包括MATLAB读取时的坐标翻转与GeoTIFF导出时的值域异常。通过实战案例,介绍了如何解决矩阵方向错乱、处理FillValue与scale_factor、精准移植空间参考等关键问题,帮助研究者高效完成气象数据的批量处理与GIS兼容性验证。

weixin_30788619的博客 654

git重置、回退、暂存

git重置、回退、暂存

sky5547的博客 1656

即梦 AI 全功能零基础详细教程(纯技术版)

即梦 AI 是一款多模态 AI 生成工具,主打文本生成视频、图片生成视频、角色一致性生成、音画同步等核心功能,依托自研 AI 视觉模型,实现从文本 / 图片 / 音频素材输入,到高清视频、图像内容输出的全流程 AI 创作,支持短视频、短剧、创意素材等多场景创作,具备操作门槛低、生成效率高、画面可控性强的技术特点。@为工具内置引用指令,作用是锁定指定素材 / 角色,强制 AI 按照该素材的核心特征生成内容,无额外付费、解锁要求,免费使用。剧本拆分:将短剧拆分为单镜头(15 秒内 / 个)

2501_92061023的博客 5834

Ajax(二):技术实现

Ajax(二):技术实现 一.若没有Ajax时,一般的表单提交代码为: 客户端代码 <form id="form1" action="Test.ashx" method="get"> 您的姓名1:<input type="text" name="fname" size="20" /> <input type="submit" name="submit" value="Sumbit"> </form> 服务端代码 public void Proce

qq_40198520的博客 303

【RTOS】 Vxworks 653 第一章 —— 初识 vx653 3.x

。。不是很重要,自己搜吧鲁棒分区是一种确保共享计算资源中独立运行功能实现​​时空隔离​​的机制,其目标是为集成模块中的混合临界性应用提供与联邦式部署(federated implementation)同等级别的功能隔离保障。具体表现为:​​多关键性共存​​:支持不同安全等级应用(如飞控系统A级与娱乐系统D级)在同一模块中协同运行。​​抗干扰能力​​:防止未授权或意外的时空干扰(如内存越界、时间窗口冲突),确保应用间互不影响。​​。

qq_38183694的博客 1280

支持向量机算法(带你了解原理 实践)

支持向量机作为一种强大的分类算法,在各个领域都取得了显著的成果。其基于统计学习理论的原理使得它能够在高维空间中找到最优分类超平面,并通过核函数处理非线性问题。

2303_79387663的博客 3737

git reset 和 git checkout的区别

一. git reset 众所周知,git reset --hard ‘版本哈希’ 可以用来回退版本,但是如果不带–hard参数,即git reset可以用来从暂存在回复到工作区。 简单的场景用例:假设一次修改了两个文件,然而需要对这两个文件分别进行两次提交,在进行缓存操作时(git add),不小心将两个文件都进行了缓存,此时我们需要对其中一个文件取消缓存,此时就需要git reset操作来实...

EmotionComputer 4085

LSM6DSOW陀螺仪轮询驱动:从I2C/SPI配置到数据读取全解析

惯性测量单元(IMU)是现代嵌入式系统中实现姿态感知与运动跟踪的核心传感器,其通过加速度计和陀螺仪测量线性加速度与角速度。在嵌入式开发中,轮询(Polling)作为一种基础且可靠的通信方式,通过主循环主动查询传感器状态,简化了初始调试与验证流程。对于I2C/SPI接口的数字传感器,掌握寄存器配置、数据就绪标志检查及原始数据转换是通用的驱动方法,能够快速验证传感器工作状态并理解数据流。LSM6DSOW作为一款高性能6轴IMU,支持可配置的量程与输出数据速率,适用于无人机飞控、手持云台等高动态场景。本文以LSM

weixin_28728265的博客 557

Git之深入解析reset命令原理以及与checkout命令的区别

一、前言 了解了管理或者维护 Git 仓库、实现代码控制所需的大多数日常命令和工作流程,尝试跟了踪和提交文件的基本操作,并且掌握了暂存区和轻量级地分支及合并的威力。如果想进一步对 Git 深入学习,可以学习一些 Git 更加强大的功能,这些功能可能并不会在日常操作中使用,但在某些时候可能还是会起到一定的关键性作用。 如果还不清楚 Git 的基础使用流程、分支的管理、托管服务器的技术以及分布式工作流程等相关的技术和能力,请参考博客: Git之深入解析Git的安装流程与初次运行Git前的环境配置;

╰つ栺尖篴夢ゞ 4216

Python 爬虫实战:抓取悦动圈跑步爱好者运动轨迹数据,规划健身路线

通过本次 Python 爬虫实战,我们学习了如何使用 Python 抓取悦动圈跑步爱好者的运动轨迹数据,并基于这些数据进行分析和处理,最终规划出健身路线。在这个过程中,我们掌握了requests、BeautifulSoup、pandas和matplotlib等库的基本使用方法,了解了爬虫的基本原理和流程。希望本文能够帮助你更好地理解和应用 Python 爬虫技术,在数据处理和分析领域取得更多的成果。

u014481728的博客 2367

【知识分享】高速印刷电路板(PCB)寄生参数计算指南

对于高速PCB设计而言,寄生参数一直是令人讨厌的问题,它们会悄悄潜入PCB并在电路中造成严重的破坏,具体来说,它们是渗透到高速电路中的隐藏杂散电容器和电感器,包括由封装引线和长走线形成的电感器、PCB焊盘对金属平面形成的电容器、走线之间形成的电容器等等。

一只豌豆象的博客 1780

Idea使用 Undo Commit,Revert Commit,Drop Commit区别

Idea使用 Undo Commit,Revert Commit,Drop Commit区别

TOP丶Chen 6万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

git status清空_详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别...

一、可以将git简单的分为三个区域1、工作区(working directory)2、暂缓区(stage index)3、历史记录区(history)如图:其中git add files 把当前工作目录中的文件放入暂存区域这其实做了两件事:1、将本地文件的时间戳、长度,当前文档对象的id等信息保存到一个树形目录中去(index,即平时说的暂存区)2、将本地文件的内容做快照并保存到Git 的对象库...

weixin_39614276的博客 1169

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

git pull 是到工作区还是暂存区_详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别...

一、可以将git简单的分为三个区域 1、工作区(working directory) 2、暂缓区(stage index) 3、历史记录区(history)如图:其中git add files 把当前工作目录中的文件放入暂存区域 这其实做了两件事: 1、将本地文件的时间戳、长度,当前文档对象的id等信息保存到一个树形目录中去(index,即平时说的暂存区) ...

weixin_29096377的博客 436

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

git如何查看缓存区文件内容_详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别...

一、可以将git简单的分为三个区域 1、工作区(working directory) 2、暂缓区(stage index) 3、历史记录区(history)如图:其中git add files 把当前工作目录中的文件放入暂存区域这其实做了两件事: 1、将本地文件的时间戳、长度,当前文档对象的id等信息保存到一个树形目录中去(index,即平时说的暂存区) 2...

weixin_28835789的博客 2831

详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别

一、可以将git简单的分为三个区域     1、工作区(working directory)     2、暂缓区(stage index)     3、历史记录区(history)     如图:   其中git add files 把当前工作目录中的文件放入暂存区域      这其实做了两件事:      1、将本地文件的时间戳、长度,当前文档对象的id等信息保存到

u010537398的博客 1511

git的撤销操作:reset、checkout和revert 区别

精讲链接:https://segmentfault.com/a/1190000009126517 这三个命令都可以用于撤销。 reset和checkout可以作用于commit或者文件,revert只能作用于commit。 Index空间,也叫做stage空间,或者cache空间 reset $ git checkout hotfix $ git reset HEAD~2 git reset 用于撤销未被提交到remote的改动,即撤销local的修改。 除了移动当前分支的HEAD,...

houhj168的专栏 1616

Git 版本回退/撤销/重置:CheckOut VS Revert VS Reset

本文分析了Git中三种常用代码回退命令:CheckOut、Revert和Reset的区别与适用场景。CheckOut适用于撤销未提交的本地修改或切换分支;Revert通过创建新提交来安全撤销已推送的更改;Reset则用于重置本地提交历史,分为三种模式(--soft、--mixed、--hard)。文章详细说明了不同开发阶段(未add、已add未commit、已commit未push、已push)应选择的对应操作,并比较了Revert和Reset的核心差异:Revert保留历史适合公共仓库,Reset修改历史

Knight 1491

Git 回滚 checkout、reset、revert

Git 回滚 reset、checkout、revert 首先看一下 Git 的工作流程 checkout 是检出的意思,作用是将某次 commit 的状态检出到工作区,它的过程是先将 HEAD 指向某个分支的最后一次 commit,然后从 commit 恢复 index,最后从 index 恢复工作区。 通常用于切换分支,创建新分支,即HEAD 从一个分支切换到另一个分支,或创建并切换到新分支。 (1)放弃工作区中的全部修改 命令:git checkout . (2)放弃工作区中某个文件的修改 命令:g

lq 4829

git pull 是到工作区还是暂存区_详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤除命令的区别...

一、可以将git简单的分为三个区域1、工作区(working directory)2、暂缓区(stage index)3、历史记录区(history)如图所示:其中git add files把当前目录中的文件放入暂存区域,这其实做了两件事:1、将本地文件的时间戳、长度,当前文档对象的id等信息保存到一个树形目录中去(index,即平时说的暂存区)2、将本地文件的内容做快照并保存到Git 的对象库 ...

weixin_42394913的博客 499

Git常用命令

一、概念理解 (一)工作区、暂存区、本地仓库、远程仓库 (二)远程分支、当前本地分支 2.Git初始化 git init 3.克隆项目 git clone https://github.com/liyinchigithub/Git-commands.git 4.拉取代码 (1)git pull 将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。 git pull origin git pull https://github.co

u013302168的博客 4万+

git中git reset /git revert /git checkout的用法

有时候,我们用Git的时候有可能commit提交代码后,发现这一次commit的内容是有错误的,那么有两种处理方法: 1、修改错误内容,再次commit一次 2、使用git reset 命令撤销这一次错误的commit 第一种方法比较直接,但会多次一次commit记录。 而我个人更倾向第二种方法,错误的commit没必要保留下来。 那么今天来说一下git reset。它的一句话概括 原文链接 https://www.jianshu.com/p/c2ec5f06cf1a ...

ITerated的博客 2131
上一篇: Git 查看、删除、重命名远程分支及tag
下一篇: Win7安装和配置SNMP - java使用SNMP4j获取监控信息
iteye_4921
博客等级 码龄8年 25粉丝 59原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值