文档章节

Git 的暂存区(staging area)理解

麦壳原野
 麦壳原野
发布于 2014/04/02 11:53
字数 782
阅读 714
收藏 19

    通常在很多传统集中式版本控制系统中,只有两个空间用来管理你的数据,一个是你的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 <file>放弃添加,或者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操作了,那到底什么是暂存区呢?我们来看个图片可能更直观

  


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

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

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

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

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

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


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

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

© 著作权归作者所有

麦壳原野
粉丝 312
博文 40
码字总数 76402
作品 0
程序员
私信 提问
三道 google 风格 git 面试题及其解答

第一题: 把配置文件推送到了远程仓库,怎样删除远程仓库的该配置文件,本地还要用到这个文件。 这种操作失误,比较常见。一般这样解决: 先解释第二步,本地需要,远程仓库不需要,肯定是要把...

邓轻舟
06/28
0
0
Git学习教程

Git是一个分布式的文件版本控制系统,每个电脑都有一个完整的文件库和版本库,文件库之间可以互相推送和抓取版本信息。CVS和SVN是集中式的文件版本控制系统,文件库和版本信息集中存放在服务...

JAVA_NINA
2016/10/21
22
0
Git常用命令速查表,新手必备版本控制

Git 跟 SVN 一样,都是用于管理代码的版本控制工具。无论在项目中,我们负责哪一块,只要需要编写代码,就必须熟悉Git(依公司要求而定)。 当然,用的越熟练,处理的项目越顺利,离出任CTO...

北月
06/04
0
0
工程化专题之Git

前言 一个专业的程序员,怎么能不掌握Git呢?版本控制领域,已经发展了一段时间,从古老的CVS,到SVN集中式管理,再到现在的Git。由于Git的分布式、everything is local、分支等诸多特性,让...

张丰哲
2017/10/15
0
0
[git学习:Pro git(2)]Git基础

Getting a Git Repository(取得项目的Git仓库) 一在工作目录中初始化新仓库: git init 初始化后,在当前目录下会出现一个名为.git的目录,所有Git需要的数据和资源都存放在这个目录下不过...

SibylY
2015/03/08
102
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— 干啥啥不行,吃饭第一名。

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 : 李白到杜甫家吃饭。杜甫洗菜,发现只有青瓜和萝卜,心中愧疚。这时,他看见了邻居家的鸡,杜甫一时心酸,忍不住喃喃自语:我希望...

小小编辑
11分钟前
50
5
Java描述设计模式(08):桥接模式

本文源码:GitHub·点这里 || GitEE·点这里 一、桥接模式简介 1、基础描述 桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是“将抽象化...

知了一笑
11分钟前
4
0
C++ 函数指针的用法

天王盖地虎626
25分钟前
1
0
白话比原链跨链技术

随着Bystack的主侧链架构的推出,主侧链之间的跨链问题也成为比原链团队的主要攻克工程难题,当前比原链已经推出了两种跨链的机制,各有不同的侧重点,可能因为本身的跨链技术比较晦涩,本篇...

比原链Bytom
33分钟前
2
0
PostgreSQL参数search_path影响及作用

search_path稍微熟悉PG就会用到,用法这里就不必讲,本篇主要讲它在程序里怎样处理。 1、GUC参数定义 这是个 config_string 参数 {{"search_path", PGC_USERSET, CLIENT_CONN_STATEMENT,...

有理想的猪
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部