热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

暂存区_git学习:理解git暂存区(stage)

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

与一般的版本管理不同的是,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 命令会直接从暂存区删除文件,工作区则不做改变。

  • git checkout . 或者git checkout -- 会用暂存区全部或指定文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

  • git checkout HEAD . 或git checkout HEAD 命令会用HEAD指向的master分支的全部或部分文件替换暂存区和工作区中的文件,比较危险。

 


推荐阅读
author-avatar
乐天小散_608
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有