今天和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. 新手学python-Day1-鸡汤,变量,编码,进制,判断

    作业要求为编写一个登录接口:`输入用户名密码`认证成功后显示欢迎信息`输错三次锁定做完作业以后,使用ctrl+alt+f格式化一下,特别舒爽 1 def jilu(str): 2 zt = open( ...

  2. 编译打包部署 Dubbo Admin

    1.下载,Dubbo地址: https://github.com/alibaba/dubbo/tree/2.5.x ,直接ZIP下载 2.解压并打开项目,mvn package 得到war包,如下图: ...

  3. 基于mybatis的CRUD

    u  基于Mybatis的CRUD u  掌握MyBatis的结果类型-resultMap和resultType u  掌握MyBatis的参数类型 u  掌握#和$两种语法 1      基于myb ...

  4. C#--二维码生成代码

    需要用到ThoughtWorks.QRCode.dll文件 string str = Server.UrlDecode(Request.QueryString["id"]); QR ...

  5. Oracle里schema理解

    在Oracle中,一个用户就是一个Schema,表都是建立在Schema中的,也可以理解为每个用户拥有不同的表.一个用户想访问另外一个用户,也就是另外一个schema的表的时候,可以用 usernam ...

  6. POJ 1811

    使用Pollard_rho算法就可以过了 #include <iostream> #include <cstdio> #include <algorithm> #i ...

  7. Chrome插件开发新手教程

    近期在用百词斩这个站点来学单词,感觉非常不错,就是在回想单词列表的时候仅仅有单词和意思.却没有读音.感觉非常不方便,思来思去,想到了Chrome插件能够胜任这个工作.于是小小的研究了一下. Chrom ...

  8. 写函数,输入n个数字输出最大值和最小值

    # ,写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}# 例如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2}(此题用到max(),min()内置 ...

  9. Exception异常常见属性

    废话少说,直接上代码: try { int n = Convert.ToInt32("@"); } catch(Exception ex) { Console.WriteLine( ...

  10. Unity3D项目

    Input.mousePosition //鼠标点击的位置 0 左键  1右键  2滚轮 Input.GetMouseButton(0) //当鼠标左键处于按下状态的时候返回True Input.Ge ...