这是开篇

有人说,暂存区是 Git 最精彩的设计,同时也是最难理解的部分,两者我都感觉不太明显,但当我想写关于暂存区的理解后,发现的确不怎么好讲,这个玩意,有点只可意会的感觉,用 Git 用熟练了,很自然体会到暂存区设计的精彩之处。

在我看来,学习其他命令之前,对暂存区有一个概念和大概理解是非常重要的,因为,很多命令都涉及到了它。

为什么 commit 之前要先 add 一下呢?

我在刚接触 Git 命令的时候,对 Git 没什么概念,就是赶鸭子上线式的学习,用到什么,就去 Google 什么,例如第一天我搜索的就是“git first commit”,然后搜到很多 Git 的初级教程,几乎都有说先执行 git add ,然后 git commit。在我照着教程一步步 add & commit 的时候,我就在想,commit 就 commit唄,为什么 commit 之前必须要 add 一下呢?

当时才疏学浅,不敢胡乱尝试,担心试错了整不回来原来的样子。现在胆子大了些,决定尝试一下没有 add 的 commit。

通过 echo 命令给 master.txt 文件加了一行内容,然后执行提交:

测试结果很明显,commit 失败,失败原因是没有可以提交的修改,然而奇怪的是,查看 master.txt 文件,内容却已经添加成功。
好在 Git 非常贴心的给了我们详细的错误说明,下面仔细看一下:

On branch master
Changes not staged for commit:modified:   master.txt

no changes added to commit

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

英语渣的我最近热衷于翻译:

在 master 分支
修改没有被暂存起来以备提交修改:   master.txt

没有可以提交的修改

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

从这个提示信息中,我似乎嗅到了一丝丝的真(jian)相(qing),commit 时检测是否有修改的 master.txt,好像不是我看到的 master.txt。那我看到 master.txt 是什么?我没看到的又是什么?而且它在哪里?

答案就比较明显了,肯定在 Git 的暂存区(不然我为啥要举这个例子,哈哈)。

git commit 执行时,会提交暂存区的内容。git add 命令会将我们看到的修改添加到暂存区中,这就是为什么 git commit 之前要先执行 git add 的原因。

接着上面的问题,思维稍微发散一下,还可以问出很多问题,例如,add 将修改放入暂存区,那么 add 之前数据存放在哪里?commit 又将存储区的数据提交到什么地方了呢?以及为什么要这么分为几个存储部分?等看完这篇博客,希望你这些问题,都能找到答案。

Git 可以大概分为三个区

Git 本地数据管理,大概可以分为三个区,工作区,暂存区和版本库。

  • 工作区(Working Directory)
    是我们直接编辑的地方,例如 Android Studio 打开的项目,记事本打开的文本等,肉眼可见,直接操作。
  • 暂存区(Stage 或 Index)
    数据暂时存放的区域,可在工作区和版本库之间进行数据的友好交流。
  • 版本库(commit History)
    存放已经提交的数据,push 的时候,就是把这个区的数据 push 到远程仓库了。

下面是,当开发者通过 git 修改数据时,各区之间的数据传递流程示意图。

为了验证以上流程的正确性,我们可以自己动手实验一下,为了对比三个区之间的数据差别,过程中,可以借助神奇的 diff 命令。

命令 作用
git diff 工作区 vs 暂存区
git diff head 工作区 vs 版本库
git diff --cached 暂存区 vs 版本库

现在三个区的数据是一致的,执行 git diff 命令都为空

命令 接果
(工作区 vs 暂存区)git diff
(工作区 vs 版本库)git diff head
(暂存区 vs 版本库)git diff --cached

然后给 master.txt 添加一行内容后,现在工作区内容发生变化,暂存区和版本库内容不变。

命令 接果
(工作区 vs 暂存区)git diff
(工作区 vs 版本库)git diff head
(暂存区 vs 版本库)git diff --cached

执行git add 操作后,修改同步到暂存区,现在工作区和暂存区数据一致。

命令 接果
(工作区 vs 暂存区)git diff
(工作区 vs 版本库)git diff head
(暂存区 vs 版本库)git diff --cached

执行 git commit 操作后,修改已经同步到版本库,三区数据再次保持一致。

命令 接果
(工作区 vs 暂存区)git diff
(工作区 vs 版本库)git diff head
(暂存区 vs 版本库)git diff --cached

Stage 赋予 Git 更多灵活性

不知道时,你对它可能毫无所感。知道后,你一定会感动地想哭,并十分之膜拜 Git 的开发者- Linus Torvalds ,stage 就是这么精彩的玩意。以下看起来比较束手无策的场景,只要理解 stage,用好相应命令,都能轻易解决:

  • 修改了4个文件,在不放弃任何修改的情况下,其中一个文件不想提交,如何操作?(没add : git add 已经add: git reset --soft )
  • 修改到一半的文件,突然间不需要或者放弃修改了,怎么恢复未修改前文件? (git checkout)
  • 代码写一半,被打断去做其他功能开发,未完成代码保存?(git stash)
  • 代码写一半,发现忘记切换分支了?(git stash & git checkout)
  • 代码需要回滚了?(git reset)
  • 等等

上面提到的 checkout & stash & reset 等命令,通过不同的参数搭配使用,可以在工作区,暂存区和版本库之间,轻松进行数据的来回切换。

例如前篇 Branch 博客用到的 git reset 回滚命令,带上不同参数就有不同的作用,如下:

命令 作用
git reset --soft 暂存区->工作区
git reset --mixed 版本库->暂存区
git reset --hard 版本库->暂存区->工作区

完事大家可以自己新建一个测试 Demo,多尝试一下,相信你会因为暂存区的存在更加地喜欢 Git。

这是结尾

暂存区是介于工作区和版本库之间的一个中间存储状态,很多命令都会涉及暂存区的状态,因此理解暂存区这一个存在是至关重要的。

希望这篇文章能给你的 Git 学习带来帮助,同时,如有错误之处还望指出,下篇博客见,see you next blog!

欢迎订阅我的Git系列文章

  • 01. 请回答:Git是什么?
  • 02. Git常用命令一日游活动
  • 03. Git三大特色之Branch(分支)
  • 04. Git三大特色之Stage(暂存区)
  • 05. Git三大特色之WorkFlow(工作流)
  • 06. Git-你好, HEAD 同学
  • 07. Git-用 cherry-pick 挑好看的小樱桃
  • 08. Git-rebase 黑魔法之打造完美的线性历史
  • 09. Git-rebase 黑魔法之打磨 commit 颗粒度
  • 10. Git-少年,你想学回滚吗?想撤销文件修改吗?
  • 11. Git-移动记录仪 & 贴心小棉袄 reflog
  • 12. Git-丢失的 commit 是真的消失了吗?
  • 13. Git-叹为观止的 log 命令 & 其参数
  • 14. Git-送娃子们一本关于如何自学 Git 的秘籍

欢迎关注博主的微信公众号,快快加入哦,期待与你一起成长!

                                </div><link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet"><div class="more-toolbox"><div class="left-toolbox"><ul class="toolbox-list"><li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true"><use xlink:href="#csdnc-thumbsup"></use></svg><span class="name">点赞</span><span class="count">21</span></a></li><li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-csdnc-Collection-G"></use></svg><span class="name">收藏</span></a></li><li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-csdnc-fenxiang"></use></svg>分享</a></li><!--打赏开始--><!--打赏结束--><li class="tool-item tool-more"><a><svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg></a><ul class="more-box"><li class="item"><a class="article-report">文章举报</a></li></ul></li></ul></div></div><div class="person-messagebox"><div class="left-message"><a href="https://blog.csdn.net/qq_32452623"><img src="https://profile.csdnimg.cn/3/8/7/3_qq_32452623" class="avatar_pic" username="qq_32452623"><img src="https://g.csdnimg.cn/static/user-reg-year/2x/4.png" class="user-years"></a></div><div class="middle-message"><div class="title"><span class="tit"><a href="https://blog.csdn.net/qq_32452623" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">DRPrincess</a></span></div><div class="text"><span>发布了125 篇原创文章</span> · <span>获赞 361</span> · <span>访问量 123万+</span></div></div><div class="right-message"><a href="https://bbs.csdn.net/topics/395529070" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-messageboard">他的留言板</a><a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a></div></div></div>

Git三大特色之Stage(暂存区)--留着当资料相关推荐

  1. Git三大特色之Stage(暂存区)

    这是开篇 有人说,暂存区是 Git 最精彩的设计,同时也是最难理解的部分,两者我都感觉不太明显,但当我想写关于暂存区的理解后,发现的确不怎么好讲,这个玩意,有点只可意会的感觉,用 Git 用熟练了,很 ...

  2. Git——三大分区【工作区 / 暂存区 / 版本区】

    前言:Git作为一个版本管理工具,最核心组成思想是它的三个分区:工作区.暂存区和工作区. 1. 工作区   Git的工作区也就是我们平时编辑代码的目录文件夹. 2. 暂存区   暂存区就是一个暂时放置 ...

  3. Git中的工作区和暂存区

    Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 0. 相关专业名词 staged changes:已更改的东西 unstaged changes:未更改的东西 stage 暂存区 ...

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

    git status  用于查看哪些文件被暂存了 红色:工作区与版本库之间对比 ,说明没有被暂存 git add .  (工作区的内容添加到暂存区) 黄绿色:暂存区和版本库,说明被暂存

  5. git 的详细使用 操作暂存区

    git 大概流程: 1.配置 1.1 配置本机全局的用户名(username)和邮箱(useremail ) 配置 >>>> 查看 一般就是新安装git才需要配置一次 git ...

  6. git中使已经加入暂存区的文件不再受版本控制

    有的时候我们会有这样的需求,自己新建了一个本地仓库,并且执行了 "git add ." 命令,此时所有的文件都加入版本控制,但是有些文件是我们不需要进行版本控制的(比如说VS工具生 ...

  7. Git三大特色之Branch(分支)

    转自: https://blog.csdn.net/qq_32452623/article/details/78355976 我习惯每篇博客都有个开篇 还记得 Git 系列第一篇 Git 自我介绍的话 ...

  8. Git三大特色之WorkFlow(工作流)

    开篇 Git 三大特色,分支,暂存区,工作流,今天终于要写到 WorkFlow 了,我彷佛已经看到胜利的曙光,走起. 何谓工作流 WorkFlow 的字面意思,工作流,即工作流程.在分支篇里,有说过这 ...

  9. git学习(四):理解git暂存区(stage)

    与一般的版本管理不同的是,git在提交之前要将更改通过git add 添加到暂存区才能提交(git commit).即使是已经交给了git来管理的文件也是如此.这里继续学习git的暂存区. 通过git ...

  10. git 工作区和暂存区

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

最新文章

  1. jvm的架构模型:基于栈式的架构和基于寄存器架构的特点
  2. Android studio 如何查看模拟器里面的文件
  3. php安装openssl 扩展
  4. SQL ROW_NUMBER() OVER函数的基本用法用法
  5. windows azure虚拟机创建——快速创建,库模板创建
  6. spring整合kafka项目生产和消费测试结果记录(一)
  7. 从上到下打印二叉树的三种题型
  8. HT for Web中3D流动效果的实现与应用
  9. 一.第一周golang学习:--string解析成基本数据类型
  10. 【POJ 1228】Grandpa's Estate【稳定凸包】
  11. https默认端口_Java企业信息化平台O2OA如何配置服务器来启用HTTPS(SSL)
  12. HyperSnap编辑捕获图像,hypersnap截动图
  13. 网易面试总结——面试案例5~面试案例8
  14. 编写python爬虫基础_0基础如何快速写python爬虫
  15. 计算机故障代码ff,电脑开机时主板上只显示FF怎么回事?
  16. if中return语句作用/条件判断中如何退出函数
  17. 差分方程模型(一):模型介绍与Z变换
  18. 腾讯WeTest牵手应用宝强强合作: 腾讯官方游戏测试服务平台推重
  19. 100g的攻击大概是多少钱一天?
  20. Python爬虫实战之爬取QQ音乐之下载有版权的音乐(五)-1

热门文章

  1. 易班学生安全上报系统脚本
  2. ThinkPad E450 10.11 驱动HD4400的注意即解决方法
  3. 计算机enter代表什么意思,enter是什么意思
  4. HTML5响应式手机模板:【超炫购物模板】——仿拍鞋网商城手机网站模板( HTML+CSS+JavaScript) 企业手机网站模板...
  5. ROS做端口映射DDNS的N个做法详细教程
  6. 专网视频会议直播系统整合部署方案附拓扑图
  7. SQL2008升级SQL2008R2完全教程
  8. 基于统计语言模型的拼音输入法
  9. 介绍几款知名的工作流系统软件
  10. try catch finally 执行简介