第二节《Git暂存区》
在上一节中我们的demo版本库经历了一次提交,我们可以使用git og --stat查看一下提交日志。
[root@git demo]# git log --stat
commit 986a1bd458ef762ddb4e4622023e8b7d4044a665
Author: Gao Yue <dgy@89mc.com>
Date: Fri Aug 25 11:55:06 2017 +0800
initwelcome
welcome.txt | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
可以看待本次提交对文件welcome.txt有一行的变更。下面仍在这个工作区中学习暂存区。
我们试一下修改过后的文件能不能直接提交
[root@git demo]# echo "welcome to beijing" >> welcome.txt
[root@git demo]# git diff //通过diff可以看到修改后的文件与版本库中文件的差异。
diff --git a/welcome.txt b/welcome.txt
index 18832d3..50886cc 100644
--- a/welcome.txt
+++ b/welcome.txt
@@ -1 +1,2 @@
Hello.
+welcome to beijing
[root@git demo]# git commit -m "append new line"
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: welcome.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
从上面的输出看来好像没有提交成功,我们来查一下看看有没有提交日志
[root@git demo]# git log --pretty=oneline
986a1bd458ef762ddb4e4622023e8b7d4044a665 initwelcome //只有上一次提交的日志,说明本次没有提交成功
为什么会提交失败呢?我们来翻译一下git commit后的输出:
# On branch master //位于您当前工作的分支master上
# Changed but not updated: //下列修改还没有加入到提交任务中,不会被提交
# (use "git add <file>..." to update what will be committed) //使用git add <file>命令后改动就会加入到提交任务中
# (use "git checkout -- <file>..." to discard changes in working directory) //使用git checkout -- <file>命令,会删除不打算提交的文件
#
# modified: welcome.txt //已修改:welcome.txt
#
no changes added to commit (use "git add" and/or "git commit -a") //警告:提交任务是空的,请使用git add和/或git commit -a命令。
也就是说,需要对修改的文件执行git add命令,将修改的文件添加到“提交任务”中后才能提交。
[root@git demo]# git add welcome.txt
[root@git demo]# echo "bye-bye" >> welcome.txt
[root@git demo]# git commit -m "version 2 welcome"
[master e97f443] version 2 welcome
1 files changed, 1 insertions(+), 0 deletions(-)
[root@git demo]# git log --pretty=oneline
e97f443b2d1cee7eeca7dc2e768f599980788c3c version 2 welcome
986a1bd458ef762ddb4e4622023e8b7d4044a665 initwelcome
可以看出经过git add后的文件提交成功,日志输出中也有我们的提交记录。
理解git暂存区(stage)
上面的示例中我们用到了"提交任务"这个概念,但是暂存区才是其真正的名称,在.git目录下有一个index文件,我们做一个测试
<1>首先执行git checkout命令撤销工作区中welcome.txt文件尚未提交的修改
[root@git demo]# git checkout -- welcome.txt
[root@git demo]# git status -s
<2>通过状态输出可以看到工作区已经没有改动,查一下.git/index文件
[root@git demo]# ls --full-time .git/index //时间戳为13:36:26
-rw-r--r--. 1 root root 112 2017-08-25 13:36:26.026673742 +0800 .git/index
<3>再次执行git status命令,然后显示.git/index文件时间戳,没有变化
[root@git demo]# git status -s
[root@git demo]# ls --full-time .git/index
-rw-r--r--. 1 root root 112 2017-08-25 13:36:26.026673742 +0800 .git/index
<4>现在更改下welcome.txt的时间戳,但是不改变其内容,再执行git status命令。时间戳为13:40:26
[root@git demo]# touch welcome.txt
[root@git demo]# git status -s
[root@git demo]# ls --full-time .git/index
-rw-r--r--. 1 root root 112 2017-08-25 13:40:26.026673502 +0800 .git/index
这个实验说明当执行git status扫描工作区改动的时候,先依据.git/index文件中记录的时间戳、长度等信息判断工作区文件是否变动,如果时间戳变了,说明文件的内容可能被改变;如果没有被改变,则将该文件新的时间戳记录到index文件中。文件.git/index实际上就是一个包含文件索引的目录树,在这个目录树中,记录了文件名和文件状态信息,文件的内容并没有在这里存储,而是保存在.git/objects目录中,文件索引建立了文件和对象库中对象实体之间的对应。
图片的介绍:
<1>左侧为工作区,右侧为版本库。在版本库中标记为index的区域是暂存区,标记为master的是master分支所代表的目录树。
<2>图中此时HEAD实际是指向master分支的一个游标,所以图中的命令中出现HEAD的地方可以用master来替换。
<3>图中objects标识的区域为git对象库,实际位于.git/objects目录下。
<4>当对工作区修改文件执行git add时,暂存区的目录树将被更新,同时工作区修改的文件内容会被写入到对象库中的一个新的对象中,而该对象的ID被记录暂存区的文件索引中。
<5>当执行提交操作时,暂存区的目录树会被写到版本库中,master分支会做相应的更新,就是master最新指向的目录树就是提交时原暂存区的目录树
<6>当执行git reset HEAD时,暂存区目录树会被重写,会被master分支指向的目录树所替换,但是不影响工作区。
<7>当执行git rm --cached <file>时,会直接从暂存区删除文件,工作区不做改变。
<8>当执行git checkout .或git checkout -- <file>时,会用暂存区全部的文件或指定的文件替换工作区的文件。这个操作会清除工作区中未被添加到暂存区的改动。
<9>当执行git checkout HEAD . 或git checkout HEAD <file>时,会用HEAD指向的master分支中的全部或部分文件替换暂存区和工作区的文件。
第二节《Git暂存区》的更多相关文章
- 【原创】关于Git暂存区的理解
关于Git暂存区的理解 暂存区可以说是Git的三大重要的区域之一,另外两个分别是工作目录和Git仓库,所以说对暂存区的深入理解可以帮助我们理解很多Git命令背后隐藏的工作原理.今天,本文将以 ...
- git暂存区
在使用git开发时,有三个概念需要知道,工作区,暂存区和版本库.工作区就是直接进行操作的地方,版本库是要将修改提交的地方,那么暂存区是干什么的呢?下面将对暂存区深入研究. 一.修改后能直接提交吗? 在 ...
- Git学习之Git 暂存区
============================= 修改文件后是否可以直接提交 ============================ (1) 向文件中追加一行内容 $ echo &quo ...
- git 填坑之 git 暂存区忽略文件
今天修改公司项目文件的时候,发现被修改的文件的始终不显示已经被修改. 本来是想要把 KWh 改成 kWh,然后执行 git status 后,没有文件修改记录: 开始分析究竟是因为什么导致的这样诡异的 ...
- idea 编辑器Git暂存区的使用
平时在开发时候 一般线上环境和线下环境区别会很大,所以一下线下的自己测试环境的代码没有如果提交会影响线上环境,所以一般都会使用git的一个暂存区作为临时存放不需要提交的代码,这样每次提交代码都可以在不 ...
- Git权威指南学习笔记(二)Git暂存区
例如以下图所看到的: 左側为工作区,是我们的工作文件夹. 右側为版本号库,当中: index标记的是暂存区(stage),所处文件夹为.git/index,记录了文件的状态和变更信息. master标 ...
- Git 暂存区的概念
工作区:我们在电脑里面能看到的目录,也就是我们用git init 命令初始化的那个目录.里面包含要添加文件和需要提交的文件,在这个目录下的文件,修改和变更,我们的git都能感知的到. 版本库:工作区有 ...
- git学习(三):git暂存区
回顾之前学过的命令: git init // 初始化一个项目 git add // 将文件交给工作区 git commit // 提交修改 查看提交日志: git log // 查看提交日志 git ...
- 完整学习git二 git 暂存区
1 git log 命令查看提交日志信息 git log --pretty-fuller #详细查看 git log --stat #查看每次提交的文件变更 git log --pretty-onli ...
随机推荐
- Learning-MySQL【6】:视图、触发器、存储过程、函数、流程控制
一.视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可.使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的 SQL 语句了 ...
- CSS基础学习(二) 之 width min-width max-width属性
width 1. 设置元素内容区(content area)的宽度. 2. 如果box-szing属性设置为border-box,width表示border area的宽度,如下图 min-width ...
- _quick_response
在线答题,抢答 `question` 题库 `correctAnswer` 正确答案(A,B,C,D) `answerA` 选项显示 `answerB`选项显示 `answerC` 选项显示 `ans ...
- STL.vector.iterator的序号
ZC:网上查到,使用vector时,只要将 find到的iterator(itX)减去vector::begin() 就可以得到itX的序号. 1.需求:得到 某个 iterator在 vector中 ...
- 查看局域网指定IP的电脑名
nbtstat -a 192.168.0.139 节点 IP 址址: [192.168.0.140] 范围 ID: [] NetBIOS 远程计算机名称表 名称 类型 状态 ------------- ...
- js创建对象的三种方法
1.使用对象初始化器:{} var person = {....} 2 var person=new object() function person(参数) { this.参数=... } var ...
- DataSet select 的使用
1) Select()——获取所有 System.Data.DataRow 对象的数组. 2) Select(string filterExpression)——按照主键顺序(如果没有主键,则按照添加 ...
- Django框架(五)
九.Django与Ajax 一.Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语 ...
- zk observer 节点
zk 集群中有3种节点:leader,follower,observer,其中 observer 节点没有投票权,即它不参与选举和写请求的投票. 比较 Follower 和 Observer 的代码: ...
- 解决Docker容器时区不一致的问题
查看linux系统时区和docker容器时区 date -R //查看linux主机时间和时区 date exec [container] date -R // 查看容器时间和时区 2者的时间差了8个 ...