与一般的版本管理不同的是,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的一个不同之处就是有暂存区的概念. 0. 相关专业名词 staged changes:已更改的东西 unstaged changes:未更改的东西 stage 暂存区 ...

  2. Git中的工作区(Working Directory)、暂存区(stage)和历史记录区(history)

    今天和git搏斗了一下午,发现了修改的文件一直commit不了.网上查了一下才发现原来git的模型里还有工作区和暂存区的说法. 工作区:在git管理下的正常目录都算是工作区.我们平时的编辑工作都是在工 ...

  3. git中的工作区,暂存区,版本库

    git status  用于查看哪些文件被暂存了 红色:工作区与版本库之间对比 ,说明没有被暂存 git add .  (工作区的内容添加到暂存区) 黄绿色:暂存区和版本库,说明被暂存

  4. Git——三大分区【工作区 / 暂存区 / 版本区】

    前言:Git作为一个版本管理工具,最核心组成思想是它的三个分区:工作区.暂存区和工作区. 1. 工作区   Git的工作区也就是我们平时编辑代码的目录文件夹. 2. 暂存区   暂存区就是一个暂时放置 ...

  5. git 的详细使用 操作暂存区

    git 大概流程: 1.配置 1.1 配置本机全局的用户名(username)和邮箱(useremail ) 配置 >>>> 查看 一般就是新安装git才需要配置一次 git ...

  6. git stage 暂存_Git撤销暂存区stage中的内容

    $ git add readme.txt提交到了stage中. $ git status On branch master Changes to be committed: (use "gi ...

  7. 【git学习四】git基础之git为项目打标签

    1.背景 今天学习了下如何给项目打标签,为此项目的修改标记版本号,然后可以直接推送版本号到服务器上,方便了很多,而且便于对项目进行管理. 2.打标签 1.查询已有标签,可以使用git tag命令,查询 ...

  8. git中使已经加入暂存区的文件不再受版本控制

    有的时候我们会有这样的需求,自己新建了一个本地仓库,并且执行了 "git add ." 命令,此时所有的文件都加入版本控制,但是有些文件是我们不需要进行版本控制的(比如说VS工具生 ...

  9. 【Git】Git概述、Git安装和使用、工作区,暂存区和版本库

    文章目录 一 Git概述 1 Git简介 2 GIt的职责 3 Git的架构 (1)集中式版本控制系统 (2)分布式版本控制系统 4 下载安装 二 Git使用 1 创建版本库 2 配置签名 (1)方法 ...

最新文章

  1. JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析
  2. 本周 AI 论文良心推荐,你想 pick 谁?
  3. ExecutorCompletionService 源码分析
  4. 提高性能:流的非阻塞处理
  5. 如何打造园本特色_如何打造一个可持续发展的特色观光园?
  6. 灯塔预计2022年春节档票房在70亿至80亿元之间
  7. oracle rds 运维服务_RDS oracle数据库运维
  8. Social Dialogue征集IT意见领袖和优秀博客的RSS地址
  9. python文本分类算法_python编写朴素贝叶斯用于文本分类
  10. php object 对象不存在。增加对象_PHP 闭包那点事儿
  11. jdom解析xml文件_JDOM编辑XML文件示例
  12. Spring MVC + Spring + Hibernate + mysql 注册登陆入门实例
  13. 2台电脑一根网线传文件_一根网线做两根用?接两个水晶头?是的你没看错
  14. JavaSE学生教师管理系统
  15. php编网页版计算器,php编程实现简单的网页版计算器功能
  16. origin画图软件 多个子图融合
  17. linux系统怎么连接显示器,Linux下笔记本外接显示器 · Eulerlee
  18. 深圳python培训学习班
  19. 如何在Revit中引入WPF界面(通俗易懂)
  20. k8s使用volume将ConfigMap作为文件或目录直接挂载_【大强哥-k8s从入门到放弃06】Secret详解...

热门文章

  1. 关于mysql单表支持的最大大小
  2. 老男孩shell实战读书笔记 (6-10章节)
  3. Andriod Studio两种签名机制V1和V2的区别
  4. 一双木棋chess[九省联考2018]
  5. Flask练手项目之通讯录
  6. 灰鸽子门徒自曝抓肉鸡内幕
  7. HashMap中hash(Object key)原理(hashcode >>> 16)
  8. CAP BASE 最终一致性
  9. 【360开源】Wayne:企业级可视化多集群Kubernetes一站式管理平台
  10. c++ 一个简单的学生 类