Git 的暂存区(staging area)理解

Stella981
• 阅读 846

    通常在很多传统集中式版本控制系统中,只有两个空间用来管理你的数据,一个是你的working copy(工作区),另一个便是 datastore(版本库),然而在Git中,引入了staging area(index)这一概念,我们可以把它看做一个“码头”,你来决定其中的哪些改变可以被“运走”。

    有了暂存区,我们的工作区边和Git库就不再直接挂钩了,这样我们可以更加灵活的控制我们的数据了,对暂存区的操作非常的简单,git add可以将你工作区的文件添加到暂存区中,git commit 可以将暂存区中的文件提交到版本库中。

举个例子吧:

$ git status
  On branch master
  Changed but not updated:
    (use "git add <file>..." to update what will be committed)
 
      modified:   README.md
      modified:   about.html
 
  Untracked files:
    (use "git add <file>..." to include in what will be committed)
 
      help.txt
  no changes added to commit (use "git add" and/or "git commit -a")

   我们修改了README.md 和about.html两个文件,并且添加了help.txt文件,当执行git status命令时,git告诉我们可以执行git add命令将修改添加到暂存区中。

$ git add .
$ git status
  On branch master
  Changes to be committed:
    (use "git reset HEAD <file>..." to unstage)
 
      modified:   README.md
      modified:   about.html
      new file:   help.txt

   当我们执行git add . 后,再执行git status, git又提示我们可以执行git reset HEAD 放弃添加,或者git commit 将暂存区的数据提交到版本库中。

$ git commit -m "Adding stuff"
  Created commit e793200: Adding stuff
   2 files changed, 3 insertions(+), 0 deletions(-)
   create mode 100644 help.txt

   这样我们就将暂存区中的数据提交到了版本库中,Git告诉我们有两个文件被修改了,插入了三行数据,添加了一个文件。

   以上便是最基本的Git操作了,那到底什么是暂存区呢?我们来看个图片可能更直观

Git 的暂存区(staging area)理解

    我们看到图片大致分成了三个区域:工作区,index,master。目前我们便可以把它们分别理解为工作区,暂存区,和版本库了。

    可以看到add 操作将工作区数据添加到了暂存区,commit操作则提交到了版本库中,而reset HEAD是用版本库中最新提交的目录树来重置暂存区的目录树。

Git 的暂存区(staging area)理解

    另外在我们执行git diff操作时后面添加不同的参数,会得到不同的结果,这是因为比较的两个对象可能不相同,如:

  • git diff 不加参数,比较的是工作区和暂存区的数据。

  • git diff --cached 比较的是暂存区和版本库中的数据

  • git diff HEAD/master 比较的是版本库和工作区的数据

这里只是大致的说明了下暂存区的一点点理解,至于暂存区给我们带来的好处和强大还有很多,让我们慢慢解开Git的面纱。

注:图片来自 机械工业出版社 蒋鑫著《Git权威指南》一书。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
胖大海 胖大海
2年前
Git 安装配置
基本概念我们先来理解下Git工作区、暂存区和版本库概念:工作区:就是你在电脑里能看到的目录。暂存区:英文叫stage或index。一般存放在.git目录下的index文件(.git/
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Git(二)Git几个区的关系与Git和GitHub的关联
一、Git的工作区、暂存区和版本库之间的区别和联系  1)工作区    在PC中能看得到的创建的一个管理仓库的目录。比如目录下GitTest里的文件(.git隐藏目录版本库除外)。或者以后需要再新建的目录文件等等都属于工作区范畴。    !(https://oscimg.oschina.ne
Stella981 Stella981
3年前
Git基础命令篇
一、Git介绍(1)Git是一个开源(LinusTorvalds为了帮助管理Linux内核开发而开发)的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,与常用的版本控制工具CVS,SVN等不同,它采用了分布式版本库的方式,不必服务器端软件支持。(2)Git的工作区、暂存区和版本库:工作区:就
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这