图解Git工做区、暂存区、版本库之间的关系

声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。

注:本文适合初学者和对git三分熟如下的读者 git

工做区、暂存区、版本库概念

拿本身亲身经从来说,初次接触git的时候最让人迷惑的无非是这三者的概念和他们之间的关系,搞懂这三个概念和他们之间的关系,能够说你对git了解已经三分熟了。本文是笔者使用git一年多后对一些基本概念的我的理解,写在这一方面给为初学者扫盲,同时也总结一下。网络

先上图,请务必将此图深深印在脑海里:
工做区暂存区版本库分布式

  • 工做区:用来编辑保存项目文件的地方,也是用户能直接操做到的地方。
  • 暂存区:保存了下次将提交的文件列表信息,通常在 Git 仓库目录中,是一个叫index的文件,一般多数说法仍是叫暂存区域;
  • 版本库:也叫本地版本库,之因此说git 快,是由于它是分布式版本控制系统,大部分提交都是对本地仓库而言的,不依赖网络,最后一次会推送的到远程仓库。

关于远程仓库本文暂时不提,过几天再更。spa

下面经过例子来讲明:设计

首先在e:/gittest/下使用git init将其初始化为一个git仓库,此时git为为咱们生成一个隐藏文件夹.git,git的暂存区和版本库都被管理在这个隐藏文件夹中。特别强调,不要闲的没事修改这个隐藏文件夹下的内容,不然git版本控制会失灵,严重的话将会给项目形成重大损失。
在e:/gittest/下,除去隐藏文件夹以外的都叫工做区,就是用户能够编辑保存项目文件的地方,咱们新建一个doc1.txt文件,并在写入一些信息。
图片描述版本控制

此时:工做区有一个doc1.txt的文件,暂存区是空的,版本库也是空的。
使用git add doc1.txt命令就将工做区中的文件添加到暂存区,此时暂存区有东西了,暂存区存放的就是即将要提交到版本库里的文件列表信息。
此时,用git status命令去查看状态,会发现git提示咱们changes to be committed,这个changes是新的文件doc1.txt。
图片描述code

接下来,咱们在工做区建立一个doc2.txt,此时,工做区有两个文件doc1.txt和doc2.txt。再用git status查看会发现暂存区的doc1.txt待提交,同时由于工做区新建的doc2.txt没有被add到暂存区,git提示咱们有一个untracked(未被追踪)的文件。
图片描述图片

咱们先使用git commit将doc1.txt提交到版本库,再将doc2.txt添加到暂存区,再将doc1.txt增长一行内容,此时,工做区中的doc1和暂存区中的doc1已经有所区别了,暂存区中存放的是上一版本的doc1和doc2,版本库中只有doc1,由于doc2尚未被commit,再用git status查看,会发现git提示咱们changes not staged for commit,意思是说doc1已经被修改了但还未添加到暂存区。事实上,git管理的是添加到暂存区里面的修改,包括增删改等等都算是能够跟踪的文件变更,也能够说git只管理咱们变更的部分变更的咱们才往暂存区提交,这也是git比其余版本系统设计优秀的一点。
图片描述工作流

咱们注意上图中,对于doc1的修改,git提示咱们,要么git add去更新暂存区的内容以便后面commit到版本库,要么使用git check out将版本库中的doc1 检出到工做区discard changes(放弃修改)。it

到这读者能够回到本文第一张图中仔细回味,并加以实验练习,相信很快能理解这工做区、暂存区、版本库之间的工做关系。

总结git基本的工做流程以下:

  1. 在工做目录中修改(此处修改包含了建立和删除)文件;
  2. 暂存文件,将文件add放入暂存区域;
  3. 提交更新,找到暂存区域的文件,将暂存区的文件commit到版本库;
  4. 若是工做区的文件改乱了(包括了误删、误改),想回到上一版本,就可使用git checkout 命令将版本库中的文件检出到工做区将本次更改discard(覆盖)掉。

码字不易,如对您有帮助,欢迎点赞收藏打赏^_^