Git 的工作区、暂存区、版本库—— Git 学习笔记 15
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
目录下。
- 当对工作区修改(或新增)的文件执行
git add
命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的 ID 被记录在暂存区的文件索引中。 - 当执行提交操作
git commit
时,暂存区的目录树被写到版本库(对象库)中,master 分支会做相应的更新。即 master 最新指向的目录树就是提交时原暂存区的目录树。 - 当执行
git reset HEAD
命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。 - 当执行
git rm --cached <file>
命令时,会直接从暂存区删除文件(可以理解为取消跟踪),工作区则不做出改变。 - 当执行
git checkout -- <file>
命令时,会用暂存区指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。举例来说:命令git checkout -- readme.txt
意思就是把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:一是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是readme.txt
已经添加到暂存区,之后又作了修改,现在,撤销修改就回到添加到暂存区时的状态。 - 当执行
git checkout HEAD
或者git checkout HEAD <file>
命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。注意,前者对工作目录是安全的,Git 会通过检查来确保不会将已更改的文件弄丢;但是后者就危险了,也许会覆盖工作目录中对应的文件! - 当执行
git reset HEAD <file>
命令时,它本质上只是将 file 从 HEAD 复制到索引中(可以理解为“取消暂存文件” )。 - 当执行
git reset --hard HEAD
时,会用 HEAD 指向的 master 分支中的全部文件替换暂存区以及工作区中的文件。也就是说你撤销了最后的提交(git commit )、git add 和工作目录中的所有工作,这样做也是危险的,除非你真的想这么做。 - 也许你会问,
git reset --hard HEAD
和git 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相关推荐
- 工作区 暂存区 版本库之间的关系
2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/langgege/blog/1796775
- git--基本知识点--1--工作区/暂存区/版本库
基本概念 我们先来理解下 Git 工作区.暂存区和版本库概念: 工作区:就是你在电脑里能看到的目录. 暂存区:英文叫 stage 或 index.一般存放在 .git 目录下的index 文件(.gi ...
- 完整学习git三 查看暂存区目录树 git diff
1显示暂存区中的目录树 git ls-files git ls-tree git diff 魔法 1工作区与暂存区比较 git diff 2工作区与HEAD比较 git diff HEAD 3暂存区与 ...
- git中的暂存区与工作区
工作区:本地 暂存区:执行git add后将文件添加到暂存区(stage) 版本库:执行git commit后将文件暂存区的所有文件添加到版本库 git checkout --<filename ...
- pycharm git gitee 如何将红色文件推送到repository?(将工作区内容添加到暂存区)(git add)
如图,test.txt和train.txt俩文件不在云端,平时的commit -> push都不管用,怎么把它们推送上去呢? 如图,先选中,然后git-> add,再commit,再pus ...
- Git——三大分区【工作区 / 暂存区 / 版本区】
前言:Git作为一个版本管理工具,最核心组成思想是它的三个分区:工作区.暂存区和工作区. 1. 工作区 Git的工作区也就是我们平时编辑代码的目录文件夹. 2. 暂存区 暂存区就是一个暂时放置 ...
- git stage 暂存_Git暂存区之理解Git暂存区(stage)
标签: 前一篇blog在实践过程有意无意地透漏了"暂存区"的概念.为了避免用户被新概念吓坏,在暂存区出现的地方又同时使用了"提交任务"这一更易理解的概念,但是暂 ...
- git工作空间、暂存区、本地仓库、远程仓库概念
1-git工作空间切换 通过 cd 切换工作空间,路径为 / 2-全局设置 git config --global user.name "唐" git config --globa ...
- git--工作区、暂存区、本地仓库、远程仓库
原文网址:git--工作区.暂存区.本地仓库.远程仓库_IT利刃出鞘的博客-CSDN博客 简介 本文介绍git的各个区:工作区.暂存区.本地仓库.远程仓库. ...
- git pull 是到工作区还是暂存区_每天一Git之简单理解工作区和暂存区
每天一Git之简单理解工作区和暂存区 1. 工作区与暂存区命令初体验 1.1. 暂存区文件与文件夹管理 [root@number ~]# cd GitDir/git_learning/ [root@n ...
最新文章
- oracle数据库如何写翻页_ORACLE数据库分页查询/翻页 最佳实践
- 了解的四大关键性概念
- [codevs 3273] 两圆的交
- 安卓模拟器获取服务器信息出错,安卓模拟器客户端与服务器不同步
- java调用javafx_Java代码调用JavaFX的例子(大力推荐)
- 深入理解OAuth2.0协议
- QT Creator5.14软件的安装与使用(Win7与Ubuntu20.04)
- 基于SpringBoot的后台管理系统(Encache配置、全局异常处理(重点))(四)
- java jre32下载_JRE7 32位官方下载
- The Love Dare爱的挑战
- php 中大括号,PHP中大括号#39;{}#39;用法实例总结
- 《战狼2》,我可以说点什么
- linux环境下常用的查找命令find、which、grep
- python-编码实现趋势外推法
- 人工智能的影响是大众还是小众,对我们的职业有什么影响?
- [比赛记录] 主流机器学习模型模板代码+经验分享[xgb, lgb, Keras, LR]
- 《如何五分钟创建自己的新币token 》Dapp开发 Web3+以太坊+智能合约开发 (一)
- 国产deepin深度操作系统20.2.3 发布
- 【卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10)】
- 鸿翼企业网盘 激活企业协作办公