与一般的版本管理不同的是,git在提交之前要将更改通过git add 添加到暂存区才能提交(git commit)。即使是已经交给了git来管理的文件也是如此。这里继续学习git的暂存区。

通过git checkout撤销工作区更改

在版本库.git目录下有一个index文件。

首先执行git checkout命令,撤销工作区中welcome.txt文件尚未提交的修改。

原来可以通过这种方法来撤销修改,妈呀,我还是菜啊。之前使用IDEA的时候只知道用revert。

git status和git diff原理

小实验:修改一个文件的时间戳,然后对应观察.git/index的时间戳。

结论:执行git status或者git diff扫描工作区改动时,

  1. 先根据.git/index文件中记录(用于跟踪工作区文件的)时间戳、长度等信息判断工作区文件是否改变。
  2. 如果工作区文件的时间戳改变了,说明文件的内容可能改变了,需要打开文件,读取文件的内容,与更改前的原始文件进行比较,判断文件内容是否被更改。
  3. 如果文件内容没有改变,则将文件新的时间戳记录到.git/index文件中。
  4. 因为如果判断文件是否更改,使用时间戳、文件长度等信息比较要比通过文件内容快得多。

.git/index

.git/index:

  • 包含了文件索引的目录树,像一个虚拟的工作区。
  • 目录树种记录了文件名和文件的状态信息(时间戳和文件长度等)。
  • 并不存储文件内容(内容在.git/objects中)。

工作区,暂存区和版本库说明

  • 左侧为工作区,右侧为版本库。在版本库中标记为index的区域是暂存区,标记为master的是master分支所代表的目录树。
  • HEAD实际上是指向master分支的一个"游标",上图命令中的HEAD可以用master来替换。
  • objects标识的区域为git的对象库,实际位于.git/objects目录下。
  • 对工作区文件新增修改,并执行git add命令时,暂存区的目录树将被更新,同时工作区修改(或新增)的文件内容会被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
  • git commit会将暂存区的目录树会写到版本库(对象库)中,master分支会做相应的更新,即master最新指向的目录树就是提交时原暂存区的目录树。
  • git reset HEAD会把暂存区的目录树会被重写,会被master分支指向的目录树所替换,但是工作区不受影响。
  • git rm --cached <file>命令会直接从暂存区删除文件,工作区则不做改变。
  • git checkout . 或者git checkout -- <file>会用暂存区全部或指定文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
  • git checkout HEAD . 或git checkout HEAD <file>命令会用HEAD指向的master分支的全部或部分文件替换暂存区和工作区中的文件,比较危险。

git学习(四):理解git暂存区(stage)的更多相关文章

  1. git学习笔记 ---工作区和暂存区

    Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工 ...

  2. [git 学习篇]工作区和暂存区

    1 工作区,就是目录/User/my./learngit 2 版本库 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库. liuzhipeng@exdroid43:~/pad/pad- ...

  3. Git学习(三)——暂存区、远程仓库、增删改管理

    一.工作区和暂存区 工作区(Working Directory) 就是在你的电脑里能看到的目录 版本库(Repository) 工作区中的一个隐藏目录.git,这个不算工作区,而是Git版本库.Git ...

  4. Git学习02 --暂存区,撤销修改,删除文件

    工作区和暂存区概念: 工作区(Working Directory)就是你在电脑里能看到的目录. 版本库(Repository) 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库. Gi ...

  5. 小丁带你走进git的世界二-工作区暂存区分支

    小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git  init git  clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...

  6. Git教程之工作区和暂存区(5)

    工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区:

  7. 【Git】(1)---工作区、暂存区、版本库、远程仓库

    工作区.暂存区.版本库.远程仓库 一.概念 1.四个工作区域 Git本地有四个工作区域:工作目录(Working Directory).暂存区(Stage/Index).资源库(Repository或 ...

  8. git教程:工作区和暂存区

    Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工 ...

  9. Git教程之工作区和暂存区

    工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区:

随机推荐

  1. BeanUtils 装载java bean

    Topic topic=new Topic(); Enumeration<String> enums=request.getParameterNames(); try { while(en ...

  2. 房产地图google map的初步应用点滴.2)(转)

    房产地图google map的初步应用点滴.1)房产地图google map的初步应用点滴.2)房产地图google map的初步应用点滴.3) 房产地图google map的初步应用点滴.4) 本来 ...

  3. 2014年15款新评定的最佳PHP框架

    通常,框架都会被认为是帮助开发者快速设计和开发动态网站的软件应用.每个月都有极大数量的新发布的 PHP 框架,使网站开发更简单更高效. 如果你是位 PHP 开发者,正在寻找当前最好的一些 PHP 框架 ...

  4. C#取得页面URL信息

    我們在開發網頁應用程式,時常需要去解析網址(Request.Url)的每個片段,進行一些判斷.例如說 "http://localhost:1897/News/Press/Content.as ...

  5. RabbitMQ消息队列名词解释[转]

    从AMQP协议可以看出,MessageQueue.Exchange和Binding构成了AMQP协议的核心,下面我们就围绕这三个主要组件    从应用使用的角度全面的介绍如何利用Rabbit MQ构建 ...

  6. PLSQL_数据结构类型的解析(概念)

    2014-06-02 Created By BaoXinjian

  7. ZOJ 1654 Place the Robots建图思维(分块思想)+二分匹配

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 AC一百道水题,不如AC一道难题来的舒服. 题意:一个n*m地图 ...

  8. Aixs2 使用总结,持续更新中 ...

    参考博客:http://zhangjunhd.blog.51cto.com/113473/23692     消息交换模式. 目前Axis2支持三种模式:In-Only.Robust-In和In-Ou ...

  9. [转]Ubuntu上安装TL-WN725N 2.0无线网卡驱动

    笔者使用的Ubuntu操作系统是13.04版本的,这个版本下,笔者使用朋友的TL-WN725N 1.0版本的无线网卡,直接插上就可以使用.正是由于这个方便性,不用去折腾什么驱动,所以笔者从京东上买了一 ...

  10. Android利用Fiddler进行网络数据抓包【怎么跟踪微信请求】

    主要介绍Android及IPhone手机上如何利用Fiddler进行网络数据抓包,比如我们想抓某个应用(微博.微信.墨迹天气)的网络通信请求就可以利用这个方法. Mac 下请使用 Charles 代替 ...