Git 的工作区、暂存区、版本库

大家都知道,在 Git 系统中有 “三棵树” 的概念。

注意:“树” 在这里的意思是 “文件集合”,而不是指特定的数据结构。

基本概念

用途
HEAD(版本库) 上一次提交的快照,下一次提交的父结点
Index(暂存区) 预期的下一次提交的快照
Working Directory(工作区) 沙盒

HEAD

HEAD 是当前分支引用的指针,它总是指向该分支上的最后一次提交。 这表示 HEAD 将是下一次提交的父结点。 通常,可以把 HEAD 看做你的上一次提交的快照。可以简单理解为: HEAD 指向分支(branch),分支指向提交

Index

Index(索引,或暂存区)是你预期的下一次提交。这就是当你运行 git commit 时 Git 看起来的样子。Git 将上一次检出到工作目录中的所有文件填充到 Index,之后你会将其中一些文件替换为新版本,接着通过 git commit 将它们转换为树来用作新提交。

工作目录

另外两棵树以一种高效但并不直观的方式,将它们的内容存储在 .git 文件夹中。工作目录会将它们解包为实际的文件以便编辑。 你可以把工作目录当做 “沙盒”,在你将修改提交到暂存区并记录到历史之前,可以随意更改。

工作区、暂存区、版本库原理图

在这个图中,可以看到部分 Git 命令是如何影响工作区和暂存区的。

图中左侧为工作区,右侧为版本库。在版本库中标记为 index 的区域是暂存区。标记为master的是master分支所代表的目录树。

图中可以看出此时HEAD实际是指向master分支的一个“游标”。所以图示的命令中出现HEAD的地方可以用master来替换。

图中的 objects 标识的区域为 Git 的对象库,实际位于 .git/objects目录下。

  1. 当对工作区修改(或新增)的文件执行 git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的 ID 被记录在暂存区的文件索引中。
  2. 当执行提交操作 git commit 时,暂存区的目录树被写到版本库(对象库)中,master 分支会做相应的更新。即 master 最新指向的目录树就是提交时原暂存区的目录树。
  3. 当执行git reset HEAD命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
  4. 当执行git rm --cached <file>命令时,会直接从暂存区删除文件(可以理解为取消跟踪),工作区则不做出改变。
  5. 当执行git checkout -- <file>命令时,会用暂存区指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。举例来说:命令git checkout -- readme.txt意思就是把readme.txt文件在工作区的修改全部撤销,这里有两种情况:一是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是readme.txt已经添加到暂存区,之后又作了修改,现在,撤销修改就回到添加到暂存区时的状态。
  6. 当执行git checkout HEAD 或者 git checkout HEAD <file> 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。注意,前者对工作目录是安全的,Git 会通过检查来确保不会将已更改的文件弄丢;但是后者就危险了,也许会覆盖工作目录中对应的文件!
  7. 当执行 git reset HEAD <file> 命令时,它本质上只是将 file 从 HEAD 复制到索引中(可以理解为“取消暂存文件” )。
  8. 当执行 git reset --hard HEAD 时,会用 HEAD 指向的 master 分支中的全部文件替换暂存区以及工作区中的文件。也就是说你撤销了最后的提交(git commit )、git add 和工作目录中的所有工作,这样做也是危险的,除非你真的想这么做。
  9. 也许你会问,git reset --hard HEADgit checkout HEAD 这两个命令有什么区别呢?感觉它们干的事情差不多啊。其实还有很大区别的,具体可以参考我的博文 git checkout 和 git reset 的区别

参考资料

【1】 廖雪峰:https://www.liaoxuefeng.com/wiki/

【2】《Git 权威指南》

【3】《Pro Git》(Scott Chacon, Ben Straub Version 2.1.14, 2018-05-19)

Git 的工作区、暂存区、版本库—— Git 学习笔记 15相关推荐

  1. 工作区 暂存区 版本库之间的关系

    2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/langgege/blog/1796775

  2. git--基本知识点--1--工作区/暂存区/版本库

    基本概念 我们先来理解下 Git 工作区.暂存区和版本库概念: 工作区:就是你在电脑里能看到的目录. 暂存区:英文叫 stage 或 index.一般存放在 .git 目录下的index 文件(.gi ...

  3. 完整学习git三 查看暂存区目录树 git diff

    1显示暂存区中的目录树 git ls-files git ls-tree git diff 魔法 1工作区与暂存区比较 git diff 2工作区与HEAD比较 git diff HEAD 3暂存区与 ...

  4. git中的暂存区与工作区

    工作区:本地 暂存区:执行git add后将文件添加到暂存区(stage) 版本库:执行git commit后将文件暂存区的所有文件添加到版本库 git checkout --<filename ...

  5. pycharm git gitee 如何将红色文件推送到repository?(将工作区内容添加到暂存区)(git add)

    如图,test.txt和train.txt俩文件不在云端,平时的commit -> push都不管用,怎么把它们推送上去呢? 如图,先选中,然后git-> add,再commit,再pus ...

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

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

  7. git stage 暂存_Git暂存区之理解Git暂存区(stage)

    标签: 前一篇blog在实践过程有意无意地透漏了"暂存区"的概念.为了避免用户被新概念吓坏,在暂存区出现的地方又同时使用了"提交任务"这一更易理解的概念,但是暂 ...

  8. git工作空间、暂存区、本地仓库、远程仓库概念

    1-git工作空间切换 通过 cd 切换工作空间,路径为 / 2-全局设置 git config --global user.name "唐" git config --globa ...

  9. git--工作区、暂存区、本地仓库、远程仓库

    原文网址:git--工作区.暂存区.本地仓库.远程仓库_IT利刃出鞘的博客-CSDN博客 ​​​​​​​​​​​​​​简介         本文介绍git的各个区:工作区.暂存区.本地仓库.远程仓库. ...

  10. git pull 是到工作区还是暂存区_每天一Git之简单理解工作区和暂存区

    每天一Git之简单理解工作区和暂存区 1. 工作区与暂存区命令初体验 1.1. 暂存区文件与文件夹管理 [root@number ~]# cd GitDir/git_learning/ [root@n ...

最新文章

  1. oracle数据库如何写翻页_ORACLE数据库分页查询/翻页 最佳实践
  2. 了解的四大关键性概念
  3. [codevs 3273] 两圆的交
  4. 安卓模拟器获取服务器信息出错,安卓模拟器客户端与服务器不同步
  5. java调用javafx_Java代码调用JavaFX的例子(大力推荐)
  6. 深入理解OAuth2.0协议
  7. QT Creator5.14软件的安装与使用(Win7与Ubuntu20.04)
  8. 基于SpringBoot的后台管理系统(Encache配置、全局异常处理(重点))(四)
  9. java jre32下载_JRE7 32位官方下载
  10. The Love Dare爱的挑战
  11. php 中大括号,PHP中大括号#39;{}#39;用法实例总结
  12. 《战狼2》,我可以说点什么
  13. linux环境下常用的查找命令find、which、grep
  14. python-编码实现趋势外推法
  15. 人工智能的影响是大众还是小众,对我们的职业有什么影响?
  16. [比赛记录] 主流机器学习模型模板代码+经验分享[xgb, lgb, Keras, LR]
  17. 《如何五分钟创建自己的新币token 》Dapp开发 Web3+以太坊+智能合约开发 (一)
  18. 国产deepin深度操作系统20.2.3 发布
  19. 【卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10)】
  20. 鸿翼企业网盘 激活企业协作办公

热门文章

  1. NYOJ 658 字符串右移
  2. 使用QT-QSerialport打不开串口的原因
  3. 池化层的back proporgation 原理
  4. 虚拟机——虚拟机的初步认识
  5. Border-radius属性--设置圆角边框
  6. iOS WebView的用法
  7. ASP.NET MVC随想录——漫谈OWIN
  8. PHP 汉字转拼音(首拼音,所有拼音)
  9. spring bean中scope=prototype“的作用
  10. 标题要在3~5字之间-三年总结