今天和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. 一步步理解linux字符设备驱动框架(转)

    /* *本文版权归于凌阳教育.如转载请注明 *原作者和原文链接 http://blog.csdn.net/edudriver/article/details/18354313* *特此说明并保留对其追 ...

  2. 《黑白团团队》第八次团队作业:Alpha冲刺 第二天

    项目 内容 作业课程地址 任课教师首页链接 作业要求 团队项目 填写团队名称 黑白团团队 填写具体目标 认真负责,完成项目 团队项目Github仓库地址链接. 第二天 日期:2019/6/16 成员 ...

  3. struct 模块简介

    用处 按照指定格式将Python数据转换为字符串,该字符串为字节流,如网络传输时,不能传输int,此时先将int转化为字节流,然后再发送; 按照指定格式将字节流转换为Python指定的数据类型; 处理 ...

  4. --- Error: failed to execute '.\ARMCC\bin\ArmAsm'

    1.KEIL4在开发STM32程序时报: Error: failed to execute '.\ARMCC\bin\ArmAsm' 或是Error: failed to execute '.\ARM ...

  5. snmp--CentOS安装Net-SNMP小计

    http://blog.csdn.net/tmpbook/article/details/39620549

  6. C++表达式求值(利用数据结构栈)

    唉,刚刚用C++又又一次写了一个较完好的表达式求值程序,最后精简后程序还不到100行.这不经让我 想到了大一上学期刚学c语言时自己费了好大的劲,写了几百行并且功能还不是非常齐全(当时还不能计算有括号的 ...

  7. Shell脚本:推断用户和用户组是否已经存在/创建用户和用户组

    通常作为一个应用程序的部署脚本,開始的第一项工作是为当前应用创建一个专用(dedicated)的用户和用户组.这个脚本非常easy.这里贴一个參考样本: #!/bin/sh user=test_use ...

  8. 在iOS中求数组元素中最大数与最小数

    之前求数组中某个数中的最大值与最小值.还真一个个比較,后来看到这种方法后,我就醉了 NSArray *testArray = [NSArray arrayWithObjects:@"-2.0 ...

  9. node-express项目的搭建并通过mongoose操作MongoDB实现增删改查分页排序(四)

    最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. Mongoose是在node.js ...

  10. js判断传入时间和当前时间大小

    //判断时间是否过期 function judgeTime(time){ var strtime = time.replace("/-/g", "/");//时 ...