git学习(四):理解git暂存区(stage)
与一般的版本管理不同的是,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扫描工作区改动时,
- 先根据.git/index文件中记录(用于跟踪工作区文件的)时间戳、长度等信息判断工作区文件是否改变。
- 如果工作区文件的时间戳改变了,说明文件的内容可能改变了,需要打开文件,读取文件的内容,与更改前的原始文件进行比较,判断文件内容是否被更改。
- 如果文件内容没有改变,则将文件新的时间戳记录到.git/index文件中。
- 因为如果判断文件是否更改,使用时间戳、文件长度等信息比较要比通过文件内容快得多。
.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)相关推荐
- Git中的工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 0. 相关专业名词 staged changes:已更改的东西 unstaged changes:未更改的东西 stage 暂存区 ...
- Git中的工作区(Working Directory)、暂存区(stage)和历史记录区(history)
今天和git搏斗了一下午,发现了修改的文件一直commit不了.网上查了一下才发现原来git的模型里还有工作区和暂存区的说法. 工作区:在git管理下的正常目录都算是工作区.我们平时的编辑工作都是在工 ...
- git中的工作区,暂存区,版本库
git status 用于查看哪些文件被暂存了 红色:工作区与版本库之间对比 ,说明没有被暂存 git add . (工作区的内容添加到暂存区) 黄绿色:暂存区和版本库,说明被暂存
- Git——三大分区【工作区 / 暂存区 / 版本区】
前言:Git作为一个版本管理工具,最核心组成思想是它的三个分区:工作区.暂存区和工作区. 1. 工作区 Git的工作区也就是我们平时编辑代码的目录文件夹. 2. 暂存区 暂存区就是一个暂时放置 ...
- git 的详细使用 操作暂存区
git 大概流程: 1.配置 1.1 配置本机全局的用户名(username)和邮箱(useremail ) 配置 >>>> 查看 一般就是新安装git才需要配置一次 git ...
- git stage 暂存_Git撤销暂存区stage中的内容
$ git add readme.txt提交到了stage中. $ git status On branch master Changes to be committed: (use "gi ...
- 【git学习四】git基础之git为项目打标签
1.背景 今天学习了下如何给项目打标签,为此项目的修改标记版本号,然后可以直接推送版本号到服务器上,方便了很多,而且便于对项目进行管理. 2.打标签 1.查询已有标签,可以使用git tag命令,查询 ...
- git中使已经加入暂存区的文件不再受版本控制
有的时候我们会有这样的需求,自己新建了一个本地仓库,并且执行了 "git add ." 命令,此时所有的文件都加入版本控制,但是有些文件是我们不需要进行版本控制的(比如说VS工具生 ...
- 【Git】Git概述、Git安装和使用、工作区,暂存区和版本库
文章目录 一 Git概述 1 Git简介 2 GIt的职责 3 Git的架构 (1)集中式版本控制系统 (2)分布式版本控制系统 4 下载安装 二 Git使用 1 创建版本库 2 配置签名 (1)方法 ...
最新文章
- JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析
- 本周 AI 论文良心推荐,你想 pick 谁?
- ExecutorCompletionService 源码分析
- 提高性能:流的非阻塞处理
- 如何打造园本特色_如何打造一个可持续发展的特色观光园?
- 灯塔预计2022年春节档票房在70亿至80亿元之间
- oracle rds 运维服务_RDS oracle数据库运维
- Social Dialogue征集IT意见领袖和优秀博客的RSS地址
- python文本分类算法_python编写朴素贝叶斯用于文本分类
- php object 对象不存在。增加对象_PHP 闭包那点事儿
- jdom解析xml文件_JDOM编辑XML文件示例
- Spring MVC + Spring + Hibernate + mysql 注册登陆入门实例
- 2台电脑一根网线传文件_一根网线做两根用?接两个水晶头?是的你没看错
- JavaSE学生教师管理系统
- php编网页版计算器,php编程实现简单的网页版计算器功能
- origin画图软件 多个子图融合
- linux系统怎么连接显示器,Linux下笔记本外接显示器 · Eulerlee
- 深圳python培训学习班
- 如何在Revit中引入WPF界面(通俗易懂)
- k8s使用volume将ConfigMap作为文件或目录直接挂载_【大强哥-k8s从入门到放弃06】Secret详解...