今天和git搏斗了一下午,发现了修改的文件一直commit不了。网上查了一下才发现原来git的模型里还有工作区和暂存区的说法。

  • 工作区:在git管理下的正常目录都算是工作区。我们平时的编辑工作都是在工作区完成。
  • 暂存区:可以理解为一个临时区域。里面存放将要提交文件的快照。
  • 历史区:commit后,记录的归档。

三者的转换关系如下图:

需要注意的是:提交一个文件需要先git add <file>把它放到暂存区,然后才能用git commit真正提交。

这是一个和svn在使用上一个很大的区别。一直commit发现提交不上去,找了好久才发现,原来是没有提交到暂存区。

实验

下面来演示一下:

首先新建一个叫做learn_git的目录,并初始化:

phantom01@phantom01-VirtualBox:~/work$ mkdir learn_git
phantom01@phantom01-VirtualBox:~/work$ cd learn_git/
phantom01@phantom01-VirtualBox:~/work/learn_git$ git init
# Initialized empty Git repository in /home/phantom01/work/learn_git/.git/

然后 git status查看现在的状态:

phantom01@phantom01-VirtualBox:~/work/learn_git$ git status
# On branch master
#
# Initial commit
#
# nothing to commit (create/copy files and use "git add" to track)

会发现现在什么都没有。毕竟这个目录里面我们还没有放东西嘛。

接下来,新建一个叫做readme.md的文件,并在里面写点内容。

然后git status来查看下状态:

phantom01@phantom01-VirtualBox:~/work/learn_git$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# readme.md
#
# nothing added to commit but untracked files present (use "git add" to track)

发现现在readme.md是"Untracked files",说明git现在还没有开始追踪这个文件,这时需要我们用git add来把这个文件添加进git 的管理。然后git status来查看当前状态。

phantom01@phantom01-VirtualBox:~/work/learn_git$ git add readme.md
phantom01@phantom01-VirtualBox:~/work/learn_git$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: readme.md
#

会发现,现在文件已经变成了"Changes to be committed"中的"new file"。

此时,我们刚才修改的部分已经被提交至暂存区。

我们修改一下文件中的内容,然后在查看一下状态:

phantom01@phantom01-VirtualBox:~/work/learn_git$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: readme.md
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.md
#

会发现,状态中又多了一个:

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory) modified: readme.md

其中"Changes not staged for commit"是说没有被提交到暂存区。

接下来我们用git commit提交一下:

phantom01@phantom01-VirtualBox:~/work/learn_git$ git commit -m "ci1"
# [master (root-commit) 41adae7] ci1
# 1 file changed, 1 insertion(+)
# create mode 100644 readme.md
phantom01@phantom01-VirtualBox:~/work/learn_git$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.md
#
# no changes added to commit (use "git add" and/or "git commit -a")
#

会发现"be committed"那一段不见了,而"not staged"还在。这说明一段内容被提交了,而后一段内容没有被提交。

接下来,我们只需要在git add和commit一次就好了。

参考资料

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013745374151782eb658c5a5ca454eaa451661275886c6000

http://selfcontroller.iteye.com/blog/1786644

知乎上关于这个的讨论:https://www.zhihu.com/question/19946553

Git中的工作区(Working Directory)、暂存区(stage)和历史记录区(history)的更多相关文章

  1. git中的版本库,暂存区和工作区

  2. git 以及 工作区 版本库 暂存区

    https://www.jianshu.com/p/a308acded2ce            这个博客介绍的比较简单 https://blog.csdn.net/qq_31828515/arti ...

  3. git命令--git checkout 之 撤销提交到暂存区的更改

    SYJ@WIN-95I6OG3AT1N /D/gitlab/ihr-kafka-produce (master) $ git status [由于工作区文件被修改了,所以显示为红色] On branc ...

  4. EF CodeFirst系列(3)---EF中的继承策略(暂存)

    我们初始化数据库一节已经知道:EF为每一个具体的类生成了数据库的表.现在有了一个问题:我们在设计领域类时经常用到继承,这能让我们的代码更简洁且容易管理,在面向对象中有“has  a”和“is a”关系 ...

  5. 小丁带你走进git的世界二-工作区暂存区分支

    小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git  init git  clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...

  6. git工作区、暂存区、版本库之间的关系

    区分三者关系 Git最让你迷惑的无非是它里面的各种概念了,如果是刚开始接触Git希望看完本篇介绍之后有一个清晰的认识,笔者认识也有限这里只说说个人对使用Git的感受,说一下它里面的几个最常用的概念的理 ...

  7. git(工作区,暂存区,管理修改,撤销修改,删除文件)

    工作区和暂存区 984次阅读 Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的l ...

  8. 【Git】(1)---工作区、暂存区、版本库、远程仓库

    工作区.暂存区.版本库.远程仓库 一.概念 1.四个工作区域 Git本地有四个工作区域:工作目录(Working Directory).暂存区(Stage/Index).资源库(Repository或 ...

  9. Git学习总结三(工作区和暂存区、撤销修改)

    工作区和暂存区 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区: 版本库(Repository) 工作区有一个隐藏目录.git, ...

随机推荐

  1. SpringBoot-CommandLineRunner实现预操作

    前提:在使用SpringBoot构建项目时,我们通常需要做一些预先操作(类似开机自启动).而SpringBoot正好提供了一个简单的方式来实现–CommandLineRunner. CommandLi ...

  2. asp.net mvc--传值-后台->前台

    后台传值到前台的方式 Model Binding # 这是public ActionResult中的最后部分 return View(listmode); json方式01 public void G ...

  3. 定时器SDK

    定时器是一切SDK的根本,欲写SDK必先确定定时器,定时器效率的高低决定着SDK函数的效率,下面是我个人写的Linux C++服务器端进程SDK中的定时器,部分参照了ACE和RocketMQ定时器的思 ...

  4. [Angular] Upgrade existing Angular app to Progressive Web App

    If you alread have an existing Angular application and want to upgrade to progressive web app. 1. In ...

  5. hive join 优化 --小表join大表

    1.小.大表 join 在小表和大表进行join时,将小表放在前边,效率会高.hive会将小表进行缓存. 2.mapjoin 使用mapjoin将小表放入内存,在map端和大表逐一匹配.从而省去red ...

  6. Hadoop高速入门

    Hadoop高速入门 先决条件 支持平台 GNU/Linux是产品开发和执行的平台. Hadoop已在有2000个节点的GNU/Linux主机组成的集群系统上得到验证. Win32平台是作为开发平台支 ...

  7. angularjs1-4 事件指令

    <div ng-app="myApp"> <div ng-controller="firstController"> <div n ...

  8. java.lang.NoClassDefFoundError: javax/servlet/ServletInputStream

    转自:https://blog.csdn.net/y970105/article/details/355401 进入 tomcat根目录/lib/servlet-api.jar复制出来,放到JDK_P ...

  9. UIPickerView的自定义视图

    UIPickerView允许开发者对列表项进行任意定制 开发者只要实现UIPickerViewDelegate协议中的-pickerView:viewForRow:forComponent: reus ...

  10. 队列(FIFO)详解

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...