1.Git工作区原理图

  要清楚理解git reset的三个模式的区别,首先应该搞明白Git的各个工作区的划分。

  工作区(working directory):在当前仓库中,新增,更改,删除文件这些动作,都发生在工作区里面。可简单理解为正在编辑的本地工程。

  暂存区(英文叫stage或index):它实际上就是一个包含文件索引的目录树,像是一个虚拟的工作区。在这个虚拟工作区的目录树中,记录了文件名、文件的状态信息(时间戳、文件长度等),文件的内容并不存储其中,而是保存在Git对象库(.git/objects)中,文件索引建立了文件和对象库中对象实体之间的对应。如果当前仓库,有文件更新,并且使用git  add 命令,那么这些更新就会出现在暂存区中。

  版本库:当前仓库下,如果没有任何的提交,那么版本库就是对应上次提交后的内容。

  下图可以清晰解释三者的关系:

  

  从上图可以看出各个git指令与各工作区的关系。

2.Git撤销指令与工作区关系实践

  2.1 git rm --cached:将文件从Index中移除

  首先在项目中创建一个aaa.txt文件。此时aaa.txt只存在于工作区(working directory)。使用git status查看文件状态:

  

  使用 git add指令将aaa,txt提交到暂存区Index,此时工作区与暂存区已同步。使用git status查看文件状态:

  

  此时如果想要将aaa.txt文件从Index中移除,只保留在工作区中,可以使用git rm --cached指令。

git add的作用是将工作区新增的文件添加到暂存区中,也可以将工作区已经被Trace文件的改动同步到暂存区中

  

  可以发现执行git rm --cached指令后,aaa.txt从Index中移除,只保存在工作区。

  

  2.2  git reset

  将aaa.txt文件重新add到Index暂存区,然后执行commit操作将aaa.txt提交到版本库。如果此时想要撤销commit,可以进行如下操作:

  git reset --soft HEAD~1, 执行后再查看status如下:

   

  可以看出,执行完git reset --soft HEAD~1后aaa.txt变成待commit状态,即aaa.txt在工作区与暂存区中保留,版本库已回滚。

  重新执行commit后,执行git reset --mixed HEAD~1操作:

  

  执行git reset --mixed HEAD~1操作后,此时aaa.txt处于待add状态,即aaa.txt保留在了工作区,暂存区与版本库中已回滚。

  重新执行commit -add后,执行git reset --hard HEAD~1操作:

  

此时aaa.txt在工作区,暂存区,版本库中均已回滚。

  注意:使用reset操作后,在git log中的commit记录也会被删除。  

2.3 git revert

  相比于reset操作会修改commit history,git revert 命令通过创建一次新的 commit 来撤销一次 commit 所做出的修改。这种撤销的方式是安全的,因为它并不修改commitm history。

  

第二章 git 工作区与reset,revert的更多相关文章

  1. Git的checkout, reset, revert

    不管是修改还是新建文件,都必须通过git add把这次修改从工作区加到暂存区: commit只是提交暂存区的修改,还没add到暂存区处于工作区的修改是不会commit的:   git checkout ...

  2. 第二章 Git

    1.安装 这个就不必细说了 2.安装完后还要进行一步设置. 在命令行输入: git config --global user.name "Your Name" git config ...

  3. 第一章 git指令与设置

    相关指令: 1.从远程的master分支上创建新的分支,此时新分支内容与master分支内容相同: git checkout master; git branch newbranch; git che ...

  4. git reset revert 回退回滚取消提交返回上一版本

    git reset revert 回退回滚取消提交返回上一版本 总有一天你会遇到下面的问题. (1)改完代码匆忙提交,上线发现有问题,怎么办? 赶紧回滚. (2)改完代码测试也没有问题,但是上线发现你 ...

  5. Android群英传神兵利器读书笔记——第二章:版本控制神器——Git

    本人一直是徐医生的真爱粉,由于参加比赛耽误了8天,导致更新得有点慢,大家见谅 2.1 Git的前世今生 Git是什么 Git安装与配置 2.2 创建Git仓库 Git init Git clone 2 ...

  6. 第七章 : Git 介绍 (下)[Learn Android Studio 汉化教程]

    Learn Android Studio 汉化教程 Let’s reset even further to remove all traces of your work on the deprecat ...

  7. git 工作区管理

    git工作区 git的工作区就是电脑中能看到的目录,比如我的learning文件夹就是一个工作区 版本库暂存区 工作去有一个隐藏的目录.git,这个不算工作区,而是git的版本库 git的版本库中存了 ...

  8. 《LINUX内核设计与实现》读书笔记之第一章和第二章

    一.第一章 1. Unix内核的特点简洁:仅提供系统调用并有一个非常明确的设计目的抽象:几乎所有东西都被当做文件可移植性:使用C语言编写,使得其在各种硬件体系架构面前都具备令人惊异的移植能力进程:创建 ...

  9. 第二章 C语言编程实践

    上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...

随机推荐

  1. maven基本用法

    一.下载及安装 1.1 下载maven 3.1.1 先到官网http://maven.apache.org/download.cgi 下载最新版本(目前是3.1.1 ),下载完成后,解压到某个目录(本 ...

  2. cs11_c++_lab3

    Matrix.hh class Matrix { int row; int col; int *p; void copy(const Matrix &m); void clearup(); p ...

  3. 这是个简单的UTF8转码的小Demo

    NSString *name = @"你好啊"; NSString *string = [NSString stringWithFormat:@"%@",nam ...

  4. SQL日期格式化应用大全

    Sql Server 中一个非常强大的日期格式化函数Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect CONVE ...

  5. JVM GC原理

    JVM原理 1.分代回收(目前JDK都采用此方式) 采用分治的思想,进行代的划分,把不同生命周期的对象放在不同代上,不同代上采用最适合它的垃圾回收方式进行回收.非堆区有CMS Perm Gen(持久化 ...

  6. Win8.1无法安装.NET Framework 3.5的解决办法

    这个问题纠结了我很多天,恢复系统也没用,差点儿就重装Win8,现在终于解决了,你也来试试吧! 机型:台电X89 系统:Win8.1 with bing 故障:在未安装.NET Framework 3. ...

  7. HTTP权威指南笔记-1.概述

    1.1 通讯 Web内容是存储在服务器上的,Web服务所使用的是HTTP协议,所以经常称为HTTP服务器.通讯过程为客户端(正常我们所使用的)发出请求,服务端根据客户端的HTTP请求响应相应数据,这就 ...

  8. python3.5------三级菜单

    笔者QQ :360212316 逻辑图 代码 city = { "华南": { "广东": ["广州市", "佛山市", ...

  9. Google V8编程详解(一)V8的编译安装(Ubuntu)

    V8的编译比较简单,需要同时安装git和svn. 下载V8源码: git clone git://github.com/v8/v8.git v8 && cd v8 切换到最新版本: g ...

  10. js判断input输入框长度(支持中英文输入)

    function CheckTxtLength(txt) { var num = txt.replace(/[^\x00-\xff]/g, 'xx').length; if (num <=11) ...