文档章节

git的暂存区原理

waynehu
 waynehu
发布于 2014/04/14 15:52
字数 581
阅读 1078
收藏 9

暂存区根本不是一个区(从底层来看),暂存区只是一个index文件,用来记录仓库里的文件和工作区里的文件这两者之间的对应关系(所谓的“跟踪”)

我先简单说说暂存区的原理 我先在工作区建立一个文件file.txt,此文件未被跟踪,所以仓库(.git目录)里没有对应的文件 当我输入git add file.txt进行跟踪时,git会将这个文件复制到仓库里,并进行改名,例如改名为d0fd9678ea839e7e01b3b0709cf5da41a276c006,同时在所谓暂存区的index文件里记录一笔---工作区的file.txt <对应为> 仓库的d0fd9678ea839e7e01b3b0709cf5da41a276c006 我开始编辑file.txt,添加了几行数据,然后我再输入git add file.txt进行再跟踪时,git会将这个新文件复制到仓库里,并进行改名,例如改名为f8764f23d79b59e7c2d006935257823963592a18,同时在所谓暂存区的index文件里,修改之前的记录,将工作区的file.txt对应为仓库的f8764f23d79b59e7c2d006935257823963592a18,以前的记录d0fd9678ea839e7e01b3b0709cf5da41a276c006被盖掉了。但d0fd9678ea839e7e01b3b0709cf5da41a276c006这个文件还是在仓库里没动。 以此类推

所以,工作区里的文件是否被跟踪,其实就是暂存区的index文件里是否有该文件的记录 如果一个项目有100个文件都被跟踪,那暂存区也只有1个index文件,里面有100行,每行记录每个文件在两区的对应关系(工作区和仓库),注意啊,还没到提交(commit)这个环节哦。 每一次git add时,都会修改这个index文件(暂存区),可以多次git add

当git commit时,git会对这个index文件取一个名字,比如97ffc2598b5e8c50750d5d515a5fbd536531c810,并保存起来 第二次提交时,git会对当时的index文件取一个名字,比如fdd9024d981ac44d7548ae377545cb9d799dce52,再保存起来 同时保存每个index文件的父辈是谁,比如fdd9024d981ac44d7548ae377545cb9d799dce52的爸爸就是97ffc2598b5e8c50750d5d515a5fbd536531c810 这些就是清单文件,有了清单文件,恢复就简单了 我要恢复某个commit,只要找到那个commit的清单文件,从清单文件里所记录的清单到仓库去找到每一个文件,并把这些文件复制到工作区,并改名为文件原来真正的名字。

© 著作权归作者所有

waynehu
粉丝 34
博文 58
码字总数 32117
作品 0
静安
私信 提问
git命令备忘录

初始化git . git init 初始化一个git resposity git add 添加到暂存区(红色表示没到暂存区) git add .表示把所有工作区的添加到 git commit -m"message" 添加文件到仓库 (绿色表示没提交)...

maskwang520
2017/04/18
0
0
详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别

一、可以将git简单的分为三个区域 1、工作区(working directory) 2、暂缓区(stage index) 3、历史记录区(history) 如图: 其中git add files 把当前工作目录中的文件放入暂存区域 这其...

天王盖地虎626
02/09
85
0
Git 的暂存区(staging area)理解

通常在很多传统集中式版本控制系统中,只有两个空间用来管理你的数据,一个是你的working copy(工作区),另一个便是 datastore(版本库),然而在Git中,引入了staging area(index)这一概...

麦壳原野
2014/04/02
714
0
Git Bash 命令

git 基础 git 分为三个区:工作区、暂存区、仓库 进入文件夹,并用git 命令初始化目录使它成为git管理仓库。 cd :进入文件目录。 ls:显示目录下所有文件。 mkdir:创建文件目录。 git init...

fengzhi714
2016/12/02
40
0
使用原理视角看 Git

Git 的玩法 欢迎来到 Coding 技术小馆,我叫谭贺贺,目前我在 Coding.net 主要负责 WebIDE 与 Codeinsight 的开发。我今天带来的主要内容是 Git 的原理与使用。 谈起 git,大家的第一印象无非...

fengyexjtu
2016/11/21
17
0

没有更多内容

加载失败,请刷新页面

加载更多

MainThreadSupport

MainThreadSupport EventBus 3.0 中的代码片段. org.greenrobot.eventbus.MainThreadSupport 定义一个接口,并给出默认实现类. 调用者可以在EventBus的构建者中替换该实现. public interface ...

马湖村第九后羿
38分钟前
3
0
指定要使用的形状来代替文字的显示

控制手机键盘弹出的功能只能在ios上实现,安卓是实现不了的,所以安卓只能使用type类型来控制键盘类型,例如你要弹出数字键盘就使用type="number",如果要弹出电话键盘就使用type="tel",但这...

前端老手
48分钟前
5
0
总结:Raft协议

一、Raft协议是什么? 分布式一致性算法。即解决分布式系统中各个副本数据一致性问题。 二、Raft的日志广播过程 发送日志到所有Followers(Raft中将非Leader节点称为Follower)。 Followers收...

浮躁的码农
56分钟前
7
0
Flask-admin Model View字段介绍

Model View字段介绍 can_create = True 是否可以创建can_edit = True 是否可以编辑can_delete = True 是否可以删除list_template = 'admin/model/list.html' 修改显......

dillonxiao
今天
5
0
从AnnotationTransactionAspect开始rushSpring事务

0. Spring 事务 with LTW 0.1. Spring 事务 With LTW的原因: Pure Proxy-base mode有缺陷,其失效原因分析及使用方法及运行机制(LoadTimeWeaverBeanDefinitionParser和 AspectJWeavingEnable......

Aruforce
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部