第二节《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 ...
随机推荐
- 一键清空Form表单数据
今天在工作项目调试bug当中,遇到这样的需求:页面上的数据太多,一个一个清空太繁琐,所以就采用全部清空的写法: $(':input','#myform').not(':button, :submit, ...
- Rancher2.0中部署Longhorn分布式存储实验
目录 1.简介 2.实验环境 3.应用商店中部署longhorn 4.创建工作负载,使用longhorn存储 5.查看longhorn UI 6.注意事项 1.简介: Longhorn是Rancher ...
- 全文检索:haystack+elasticsearch
优点: 1.查询速度快 2.支持中文分词准备工作:安装es软件 1.拷贝到ubuntu 2.docker load -i 文件路径 3.配置 修改ip地址 4.docker run -dti --ne ...
- 第 8 章 容器网络 - 070 - 如何定制 Calico 网络 Policy?
定制 Calico 网络 Policy Calico 默认的 policy 规则是:容器只能与同一个 calico 网络中的容器通信. Calico 能够让用户定义灵活的 policy 规则,精细化控 ...
- Vue mixins(混入)
建立一个公共组件,然后对该组件进行混入继承. 注意会走两个生命周期,谨慎使用 mixins混入,相当于生成new 组件:组件引用,相当与在父组件内开辟了一块单独的空间 mixins适用于,两个有非常相 ...
- SQL SERVER 查看sql语句性能与执行时间
[方法一] set statistics profile on set statistics io on set statistics time on go --sql语句 go set statis ...
- 『TensorFlow』SSD源码学习_其七:损失函数
Fork版本项目地址:SSD 一.损失函数介绍 SSD损失函数分为两个部分:对应搜索框的位置loss(loc)和类别置信度loss(conf).(搜索框指网络生成的网格) 详细的说明如下: i指代搜索 ...
- Annotations
一.介绍 注解,可以将注解看成一种特殊的接口.是一种特殊种类的元数据,它能够关联Java语言中不同元素和结构.有意思的是,在Java生态系统中大多数使用样板XML描述符的地方,注解在消除这些XML描述 ...
- sublime3 前端个人常用插件及快捷键
首先先介绍如何启用插件安装功能: 打开Sublime 3,然后按 ctrl+` 或者在View → Show Console 在打开的窗口里黏贴这个网站上的代码(注意: Sublime 2和3所黏贴的 ...
- Com 调用word和excel
using Microsoft.Office.Interop.Word;using System;using System.Collections.Generic;using System.Compo ...