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

2023-05-16

这是开篇
有人说,暂存区是 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


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

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

没有可以提交的修改


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

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

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

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

Git 可以大概分为三个区
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!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git三大特色之Stage(暂存区) 的相关文章

  • 尽管有 svn 复制,如何 git svn 克隆完整历史记录

    在我的公司 我们即将从 svn 切换到 git 我们使用的 SVN 非常大 没有 svn 布局 并且在每个版本拆分上我们都制作了一个 svn 副本 SVN存储库结构 svnserver company de product xy 主要版本号
  • 如何使用 libgit2 创建空提交?

    我一直在寻找libgit2 C API 参考 https libgit2 org libgit2 但我不知道如何模仿git commit allow empty libgit2 是否有内置方法来创建空提交 如果没有 git 如何在底层创建一
  • 由于不存在大文件而导致 git Push 错误

    当尝试推送到 git 时 我不断得到相同的结果 Counting objects 78 done Delta compression using up to 4 threads Compressing objects 100 67 67 d
  • 本地git,推送到tfs远程repo

    我厌倦了向我的队友解释使用 DVCS 相对于 CVCS 的好处 他们中的一些人害怕学习曲线 另一些人则看不出任何原因 因为对他们来说 这都是一样的 就我个人而言 我对 TFS 及其问题感到非常厌倦 每当我需要进行一些小的 修复 时 我都必须
  • 无法将 git add origin git@anything 与新的 git 目录一起使用

    我有一个项目 我正在生成许多提交 因此它占用的空间正在快速增长 由于我有一个 gitlab 页面来推送提交 因此我决定最好删除本地 git 目录中的这些旧提交 因为我始终可以从 gitlab 获取它们 为此 我只需删除本地 git 目录 然
  • 从 master 更改为新的默认分支 git

    这是一个场景 我们有一个默认的分支 Master 我们以此为基础 创建分支并向上推等等 我们现在创建了一个Develop分支Master并将其设置为默认开发分支 我想知道的是 我现在如何知道我的 git pull 命令是否通过命令行请求默认
  • 如何使用“gem install”命令从私有 GitHub 存储库安装 gem

    如何在本地安装托管在 GitHub 上的私人存储库中的 gem 特别是 我们通过gem install命令而不是在 Bundler 中使用 因为它是一个命令行工具 我尝试这样做 gem install githubname repo s h
  • 合并之间的 git rebase 会导致完全不相关的文件发生冲突

    我有一个大型 Git 存储库 几个月前引入了一个错误 我想bisect它 首先引入一个过去的提交 存储库 然后重播合并 做rebase到新的 commit 如下图所示 据我了解 由于合并 Git 似乎无法正常工作 预期的 但我想更好地了解为
  • EGit(Eclipse git 插件)可以使用 SSH 密钥代替用户名和密码吗?

    我需要提交的 git 中央存储库是使用 SSH 密钥配置的 我的用户名是jmglov 但是当我执行 git 操作时 例如git clone 我使用这个配置 jmglov kitiara cat git config remote origi
  • Git 在推送代码时返回错误 403 [重复]

    这个问题在这里已经有答案了 一切都工作正常 直到我创建了一个新的 GitHub 帐户 当我尝试使用新帐户第一次将代码推送到 github 服务器时 出现以下错误 remote Permission to NEW USER NEW REPO
  • RuntimeError:模型类 django_messages.models.Message 未声明显式 app_label 并且不在 INSTALLED_APPS 中的应用程序中

    我正在尝试使用https github com arneb django messages https github com arneb django messages打包我的消息传递内容并尝试了以下操作 pip install git h
  • git Branch -d :致命 - 无法查找 HEAD 的提交对象

    假设我在一个裸存储库 远程 中 如果我尝试使用以下命令删除分支git branch d
  • TeamCity 将功能分支推送到主分支

    有没有办法将成功构建的功能分支推送到另一个分支 我想要这样的东西 Git 存储库 Gitorious GitHub 等 分支机构 master 当前项目的代码 质量保证 代码等待 QA 的分支 功能分支 许多远程分支 开发人员可以在其中开发
  • 如何解决 VS Code 中变基拉取的合并冲突?

    当我做一个git pull rebase 并且我的提交中存在合并冲突 我得到冲突差异视图 解决所有冲突并暂存文件 然后呢 我可以打开终端并运行git rebase continue但是 VS Code 中不应该有一个按钮来完成变基吗 只需使
  • Git:压缩 master 上提交的最简单方法[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 git 将最后 X 次提交压缩在一起 https stackoverflow com questions 5189560 how can i squash my last x commits
  • 我在哪里? *(无分支)

    我已经熟悉了创建 合并和删除分支 我想知道我在哪里 这样我就不会将工作提交到错误的分支 我用git branch a看看我有哪些分支 我认为星号 显示我当前所在的分支 当我得到以下信息时 这意味着什么 no branch master or
  • 从自己的 gitlab 服务器安装节点模块

    我想从我们的 gitlab 服务器安装节点模块 这是存储库的链接 http ABCD GITLAB myGroup myNodeModule git http ABCD GITLAB myGroup myNodeModule git 根据n
  • 如何禁用 GitHub 中的拉取请求?

    我试图了解如何禁用 github 中的 拉取请求 问题一 我们正在尝试使用变基工作流程 这意味着如果不是快速推进 那么使用拉取请求可能会有害 一种解决方案 为我想要禁用拉取请求的分支设置分支权限 或者将我添加为任何进入 master 的内容
  • 自动同步两个 git 存储库

    是否可以保持同步两个 Github 存储库 远程 的特定文件夹 有两个 github 存储库 repoA 和 repoB 这两个存储库都有名为 ABC 的文件夹以及其他独特的文件夹 如果repoA的文件夹ABC中的任何文件有更新 我想自动更
  • 在 Windows 上使用 Git - 意外丢失了大量工作。我可以拿回来吗?

    我很困惑 我想我已经失去了几个小时的工作时间 我之前在 Git 中编辑了一个文件 我保存了它 但没有提交 我确实做了一些其他文件更改 并提交并推送了它们 然而 有一个文件被搞乱了 所以我单击了最后一次成功的提交 然后按了 回滚到此提交 令我

随机推荐

  • 遇到 definition duplicated 怎麼辦

    net 4 0 in IIS7 中有一個 known issue xff1a 就是 xff0c 在deploy之後會發生section定義重複的問題 解決這個問題的最好方法就是 把webconfig中的這段代碼註釋掉 This error
  • Docker容器学习二之镜像

    一 镜像 Docker可以把我们的应用打包成一个可移植的镜像 xff0c 也可以拉取打包好的镜像来共自己使用 xff0c 那么也会存在一个存放docker镜像的仓库 一个官方的镜像仓库地址 https hub docker com xff0
  • 【STM32】 HAL库+STM32CubeMX 系列教学

    HAL库简介 STM32 HAL固件库是Hardware Abstraction Layer的缩写 xff0c 中文名称是 xff1a 硬件抽象层 HAL库是ST公司为STM32的MCU最新推出的抽象层嵌入式软件 xff0c 为更方便的实现
  • 什么程度才算精通 Linux?

    本文选自 攻克 Linux 系统编程 作者 宇文拓 责编 林瑟 Linux 的优秀之处自然不必多说 如果将操作系统比作一辆汽车 xff0c 那 Linux 就是一辆性能出色的多功能越野车 xff0c 上山下海飞天无所不能 如果你拥有了它 x
  • Makefile初级语法1

    Makefile基本规则 基本规则如下 xff1a target target dependent command command前必须是TAB 语法示例分析 xff1a helloworld o main o print hello o
  • RealSense T265环境配置

    RealSense T265环境配置 二进制安装SDK2 0 官网的指导 https www intelrealsense com https github com IntelRealSense librealsense blob deve
  • COMTool安装测试

    COMTool安装测试 没错 xff0c 这又是GitHub上的一个开源项目 xff0c 我几乎又折腾了一下午 xff0c 依旧没有成功 好看实用跨平台带图形界面无广告串口调试助手 网络调试助手 终端工具 COMTool https git
  • opencv imread 函数读取CV_16UC1的png图片

    opencv 2 4 11中imread读取图片有三种方式 xff1a CV LOAD IMAGE UNCHANGED lt 0 loads the image as is including the alpha channel if pr
  • Docker: Ubuntu使用VNC运行基于Docker容器里的桌面系统

    xff08 由于看到的出处不是原作者 xff0c 还请原作者看到后及时说明出处 xff09 https hub docker com r dorowu ubuntu desktop lxde vnc https github com fcw
  • 三菱IPM驱动芯片PSS15S92\PSS20S92分析

    三菱IPM驱动芯片分析 三菱PSS15S92 PSS20S92 IPM功率模块资料 电机驱动方案 60 300V STM32驱动无刷电机 60 300V高压无刷电机驱动电路参考电路图及PCB www cirmall com circuit
  • PCAP01 PCAP02 PCAP04芯片配置程序及代码

    PCAP01 PCAP02 PCAP04芯片配置程序及代码 www cirmall com circuit 23606
  • 正点原子STM32F405RG飞控 二层板低成本(原理图+PCB+程序)

    正点原子STM32F405RG飞控 二层板低成本 xff08 原理图 43 PCB 43 程序 xff09 www cirmall com circuit 18606
  • px4 pixhawk2.4.6 2.4.8 px4fmu bootload 和 烧写详细说明文档

    www cirmall com circuit 23428
  • xv7011 xv7021(手册+原理图+代码stm32)

    需要的可以去电路城下载程序和PCB www cirmall com circuit 23605
  • openmv4 MT9V034

    www cirmall com circuit 24049
  • 安装aptitude

    aptitude 与 apt get 一样 xff0c 是 Debian 及其衍生系统中功能极其强大的包管理工具 与 apt get 不同的是 xff0c aptitude 在处理依赖问题上更佳一些 举例来说 xff0c aptitude
  • 分析函数调用关系图(call graph)的几种方法

    绘制函数调用关系图对理解大型程序大有帮助 我想大家都有过一边读源码 xff08 并在头脑中维护一个调用栈 xff09 xff0c 一边在纸上画函数调用关系 xff0c 然后整理成图的经历 如果运气好一点 xff0c 借助调试器的单步跟踪功能
  • 车载总线系列——CAN总线入门(五)

    我是穿拖鞋的汉子 魔都中坚持长期主义的工程师 老规矩 分享一段喜欢的文字 避免自己成为高知识低文化的工程师 在松弛中打开自己 内心阔朗透气 对外界保持开放度 客气不争 但静守原则 慢慢让自己堆积成形 自性光明 回归正题 本文主要分享车载总线
  • Activiti7各种的坑

    数据库连接的问题 不创建表的问题 xff0c 一运行就发现 org apache ibatis exceptions PersistenceException Error querying database Cause java sql S
  • Git三大特色之Stage(暂存区)

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