git add 命令详解

2023-10-31

1. 前言
2. git add 基本操作
3. git add 命令参数
4. git add 背后做了什么

1. 前言


众所周知,git 中有工作区、暂存区、版本库三大组成部分

工作区: 电脑中能看到的目录,也就是写代码的地方

暂存区: 英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件中,暂存区有时也叫做索引

版本库: 在工作区中有一个隐藏目录 .git,这个不算工作区,而是 git 的版本库

2. git add 基本操作


add 命令的作用就是将工作区的文件添加到暂存区

使用示例

 
  1. # 将某些文件提交到暂存区
  2. git add <file1> <file2>
  3. # 将某些目录提交到暂存区
  4. git add <folder1> <folder2>

3. git add 命令参数


-A, --all add changes from all tracked and untracked files 添加所有跟踪和未跟踪文件的更改

-A 参数会监控工作区的状态树,它会把工作区的所有变化提交到暂存区,包括修改(modified)、新文件(Untracked files)、删除的文件(deleted)。使用 . 在 git 2.x 也可以达到一样的效果,但在 git 1.x 中不同的是 . 不会监控删除的文件

在 git2.x 中,下面两种用法的效果完全相同

 
  1. git add .
  2. git add -A

-u, --update update tracked files 只更新已被跟踪文件

只监控已经被 add 的文件,也就是 tracked files,不会监控没有被跟踪的新文件

 
  1. git add -u

4. git add 背后做了什么


先说结论: git add 会在 .git/objects 目录下面创建一个目录和文件,并且在 .git/index 文件中添加一行内容

这里会说到 git cat-file 命令,虽然平时不怎么用,但是它能帮助我们理解 git add 背后到底做了什么

创建一个 git 仓库,用于查看 git add 背后做了什么操作

 
  1. $ git init
  2. $ echo 'hello git' >> 1.txt
  3. $ git add 1.txt
  4. $ .git/objects
  5. ├── 8d
  6. │ └── 0e41234f24b6da002d962a26c2495ea16a425f
  7. ├── info
  8. └── pack

执行 git add 后:

1、git 会将工作区中的文件使用 hash sha-1 算法得到 40 位的 blob 对象 hash 字符串文件,文件中存储的是文件类型和使用算法压缩后的内容,如果查看文件的原始内容,需要使用 git cat-file -p <hash>。这个文件存放在 .git/objects 目录下

 

2、git 会在 .git/index 文件中增加一行内容,就是 hash 值对应的文件名。此时就实现了文件名和内容相对应的操作

 
  1. # 查看暂存区中的文件名
  2. git ls-files
  3. # 查看暂存区中的文件更多信息
  4. git ls-files -s

100644 指的是文件权限,hash 字符串对应 .git/objects 目录下的文件

查看 hash 文件

 
  1. # 查看文件类型
  2. git cat-file -t <hash>
  3. # 查看文件内容
  4. git cat-file -p <hash>
  5. # 使用示例
  6. git cat-file -t 8d0e412
  7. git cat-file -p 8d0e412

git cat-file -t 查看文件类型的返回值

类型 描述
blob 存储的是工作区文件的内容
tree 工作树
commit 提交记录信息以及工作树
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git add 命令详解 的相关文章

  • 当你的项目有秘钥时,如何推送到 GitHub?

    我正在尝试将一个全新的空 Rail 3 0 4 项目推送到 GitHub 但刚刚意识到 cookie 会话存储有一个密钥 In config initializers secret token rb NewRuby192Rails304Pr
  • Intellij Idea可以自动阶段更改吗

    经过几天的任务处理后 我决定看看已经完成了哪些工作git status来自 Git Bash 有些文件在Changes to be committed list 有些在Changes not staged for commit 有趣的是 我
  • 如何使用 OR/AND 运算符在 GitHub 上进行搜索

    如何在 GitHub 上搜索包含关键字 java AND python 或 C 的问题 是否可以使用 OR AND 等逻辑运算符来表示搜索 事实证明 GitHub并没有提供实现ANR OR这样的搜索逻辑的函数 我想到的解决方案是编写一个爬虫
  • 仅当除 master 之外的所有分支都有推送的 TAG 时,Gitlab 才会触发 Pipeline

    我的 YAML 文件必须如何配置 以便仅在推送标签时触发一种情况 作业 构建 的管道 该标签可能位于除 master 之外的所有分支中 对于主案例 我有一个单独的工作 build master yaml 文件 问题 如果主分支获得标签 管道
  • 如果检测到更改中的特定短语,如何阻止 git commit?

    我注意到开发人员倾向于做的一些模式 例如使用以下代码提交 javascript 测试fdescribe or fit留在其中 这意味着只有一个测试 套件将运行 通常是在审查阶段发现的 但最好尽早发现这些小事情 想知道是否有一种方法可以配置
  • 当存储在变量中时,Git 提交消息变得混乱[重复]

    这个问题在这里已经有答案了 我有一个 Git 提交 其中有一个摘要 然后是一些描述 所以当我看到提交消息时git log format B n 1
  • 尽管存在但未找到 Git https:// 存储库

    我在 github 上有一个私人仓库 它的位置被改变了 我尝试更换遥控器 但无法再按了 ls remote https github com xxxxx xxxxx git 给了我这个 远程 未找到存储库 致命 存储库 https gith
  • 是否可以在不从 git 克隆或拉取的情况下获取分支名称?

    我想获取 git 存储库的所有分支名称 目前 我克隆存储库 然后将它们获取到本地计算机上 这是低效的 因为我所需要的只是名称而不是其他 我想知道是否可以这样做 如果是这样 我可以使用什么命令 在本地 无需克隆 您可以键入 使用 gitls
  • Git 更新文件时更改默认 umask

    我的 Git 有问题 我在 Google 和 StackOverflow 中搜索了解决方案 但没有任何帮助 问题是 每次 git 更新工作目录中的某些文件时 当我签出分支或合并分支等时 文件权限都会更改 以便添加 可写到组 标志 如果该文件
  • git checkout 裸露,并在接收后包含子模块

    如何在包含子模块的接收后挂钩中检出服务器上的裸存储库 我目前将其作为接收后挂钩 bin bash http blog ekynoxe com 2011 10 22 git post receive for multiple remote b
  • github 网络图查看器的替代品? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我单击 github 上的 forks 按钮时 我想获得一个摘要 这就是我使用网络图查看器获得的结果 但它并不完全理想 我会做什么ide
  • 空提交的 Git 补丁

    我创建一个空提交 git commit allow empty m something important 有时它很有用 例如协调 2 个 或更多 不同的 git 树 然而 当我 git format patch 空提交被省略 因为它们不与
  • 从 svn 到 git,移动了主干

    我正在尝试将 svn 存储库切换到 git 这是一个旧的存储库 以前的维护者之一为每个新版本移动了主干 例如 以前的存储库位于 svn ssh svn mycompany com project release 1 trunk 现在 我们当
  • 有没有办法显示 Visual Studio 执行的 Git 命令? [复制]

    这个问题在这里已经有答案了 在 Visual Studio Code 中 有一个 显示 Git 输出 菜单项 显示最近运行的 Git 命令 有关其外观的示例 请参阅3 35 在这个视频中 https code visualstudio co
  • 检查 GitHub 令牌的范围

    我想被动地检查 GitHub 安全令牌的权限 范围 而不将某些内容推送到存储库中 我尝试了以下命令 我替换了 your username 你的访问令牌和我的存储库的 URL 但它显示一个错误 curl 3 URL 使用错误 非法格式或缺少
  • AngularJs:显示来自 git 或 Bower 的版本号

    我创建了一个 Angular 应用程序 我想在屏幕上显示应用程序的当前版本号 目前我已将其实现为常量 application constant constants VERSION 1 1 2 但这需要我在每个新版本上更新常量 我使用 Bow
  • 如何在cygwin下更改git中文件的大小写?

    我们在区分大小写 不敏感的混合环境 cywgin linux 中工作 今天有人通过重命名文件 将 S 更改为 s 对我们的工作流程造成了小破坏 这导致了各种有趣的跨分支合并问题 而且说实话 没有人完全确定发生了什么 在 cygwin 的 g
  • 获得干净的 git 沙箱的最有效方法是什么?

    对于我的持续集成构建 我想确保我的 git 沙箱中没有存放任何杂散文件 并且没有任何文件被无意中更改 我知道关于git reset hard HEAD 这解决了部分问题 但我想我想做的是删除所有未跟踪和忽略的文件 我可以用蛮力的方式做到这一
  • 如何在 git merge 提交中列出冲突的文件(父级都有更改的文件)?

    qgit 有一个很好的选择 可以在合并提交中查看 有趣 的文件 其中有趣的文件被定义为在两个父文件中都有更改的文件 查看此类文件的相应命令行是什么 git show name status SHA1 of merge 将向您显示提交消息和在
  • 运行 npm install - 如何配置不使用 SSH(端口被防火墙阻止)

    当我跑步时npm install大多数模块配置正确 然而 至少有人想击中ssh 拉取模块的地址 不幸的是 我的公司有一项政策 不允许内部网络之外的 SSH 连接 我收到的具体错误是 Error while executing npm ERR

随机推荐

  • Qt打包生成可执行程序

    一 为什么QT要打包和部署 因为我们要把写好的程序发给用户来用 我们写好的源码也不是随便给别人的 二 QT如何打包和部署 1 我们把工厂切换到release模式 然后编译 release模式 基本没有调试信息 debug模式 有很多调试信息
  • STM32学习:通过DMA读取ADC规则通道多通道转换数据

    1 STM32的DMA简介 直接存储器存取 DMA 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输 无须CPU干预 数据可以通过DMA快速地移动 这就节省了CPU的资源来做其他操作 两个DMA控制器有12个通道 DMA1有7
  • MATLAB基本运算

    算术运算 1 基本运算符 加 减 乘 右除 左除 乘方 MATLAB的算术运算是在矩阵意义下进行的 单个数据的算术运算只是矩阵运算的一种特例 加减运算 若两矩阵同型 则运算时两矩阵的相应元素相加减 若两矩阵不同型 则MATLAB将给出错误信
  • 《科研伦理与学术规范》期末考试答案2023

    1 单选 2 分 关于科研伦理描述不正确的说法是 A 规范则未必均是在道德层面上具有调整性 B 伦理学已经从传统的以人为中心走向现代的以行为为中心 C 现代伦理学主要关注以行为 准则 规范 义务 D 所有的规范的评判都涉及到 善恶正邪 的价
  • C#实现QQ窗体功能

    C 实现QQ窗体功能 案例简述 预备知识导图 功能结构 知识点分析 C 基础知识 Windows系统知识 控件和组件 案例简述 通过C 使用类似QQ窗体的功能 当窗体放置到屏幕的边缘 可以将窗体隐藏 当鼠标再次放置到屏幕边缘时 窗体可再次显
  • centos安装docker详细步骤

    目录 一 前言 1 环境要求 2 官网中文安装参考手册 二 安装步骤 1 卸载旧版本 2 安装需要的软件包 3 设置docker镜像源 1 配置docker镜像源 方式1 官网地址 外国 方式2 阿里云源 2 查看配置是否成功 4 更新yu
  • 使用sklearn完成4种基本的分类算法:朴素贝叶斯算法、决策树算法、人工神经网络、支持向量机算法

    文章目录 实验目的 实验内容及步骤 实验数据说明 实验过程 朴素贝叶斯分类 决策树 决策树概念简介 神经网络 SVM 实验目的 巩固4种基本的分类算法的算法思想 朴素贝叶斯算法 决策树算法 人工神经网络 支持向量机算法 能够使用现有的分类器
  • iOS编程基础-Swift(四)-对象类型(续)

    Swift iOS9 Programming Fundamentals With swift 第四章 对象类型 第三章介绍了一些内建对象类型 不过还没有谈及对象类型本身 即 枚举 结构体 和 类 本章结构 1 介绍一下对象类型 2 详细介绍
  • 时空RBF-NN预测混沌时间序列

    时空RBF NN预测混沌时间序列 混沌理论是现代非线性动力学研究的重要分支之一 混沌现象不仅存在于物理系统中 还出现在金融 生物等领域中 混沌时间序列的预测一直是研究者关注的焦点 本文提出了一种基于时空RBF NN的混沌时间序列预测方法 并
  • OMA DM终端管理

    居然还有这个东西 今天才知道 好强大 OMA全称是Open Mobile Alliance 即开放移动联盟 成立于2002年7月 由近200家公司组成 它的目的是搜集市场需求 规范业务应用层和网络功能层之间的接口 定义一个公开的标准框架 从
  • web项目时Spring监听器配置

    问题 每次使用ClassPathXmlApplicationContext 和getBean 方法时 都会加载spring配置文件 影响性能 解决方案 1 在服务器启动的时候 创建对象加载配置文件 2 底层使用监听器 listener 和S
  • ISE中FIFO IP核的Standard FIFO和First-word-Fall-Through模式的仿真比较

    ISE下的FIFO IP核有Standard FIFO和First word Fall Through两种模式 相对于标准模式FWFT First word Fall Through 可以不需要读命令 自动的将最新数据放在dout上 接下来
  • Qt中的串口编程之一

    QtSerialPort 简介 QtSerialPort模块是Qt5库的附加部分 为硬件和虚拟的串口提供了统一的接口 注意 该模块也增加了对Qt4的支持 串口由于其简单和可靠 目前在像嵌入式系统 机器人等工业中依旧用得很多 使用QtSeri
  • QFrame类使用总结

    QFrame与QWidget的区别 QFrame是基本控件的基类 QWidget是QFrame基类 关系如下 QPushButton QLabel gt QFrame gt QWidget 我们经常会从QFrame或者QWidget继承然后
  • 手机把网页保存为html,怎么保存整个网页

    手机评站网今天精心准备的是 怎么保存整个网页 下面是详解 如何另存整个网页 如何另存整个网页 如何另存整个网页 1 在手机桌面中找到手机百度 点击打开手机百度 如下图所示 2 在手机百度中找到自己想要另存为的网页 点击进入该网页如下图所示
  • Visual Studio运行程序执行太快,看不到运行屏幕的结果,设置项目属性解决。

    一 右击项目 找到属性 二 找到链接器 三 链接器中找到子系统 子系统 选择控制台 SUBSYSTEM CONSOLE 应用 确定即可 四 也可以补充getchar 可以利用从键盘获取一个字符 来显示调试窗口
  • C++ 二叉树序列化与反序列化

    本人微信公众号 CPP进阶之旅 如果觉得这篇文章对您有帮助 欢迎关注 CPP进阶之旅 学习更多技术干货 C 二叉树序列化与反序列化 1 题目要求 2 题目说明 3 核心问题 4 解题思路 5 代码实现 6 问题扩展 7 重要说明 1 题目要
  • 从源码出发浅析 Android TV 的焦点移动原理(下篇)

    转自 https cloud tencent com developer article 1006297 2 2 findNextFocus 如果开发者没有指定nextFocusId 则用findNextFocus找指定方向上最近的视图看一
  • 方差、协方差、期望、相关系数等概念集合

    首先说明一下 本文是本人在复习方差等相关知识的过程中 通过网络上的相关讲解 进行个人总结后得到的 并非个人原创 在此发布只是为了作为一个学习记录与大家分享 1 期望 试验中可能出现的值及其概率的乘积 即是数学期望 1 离散型 离散型随机变量
  • git add 命令详解

    1 前言 2 git add 基本操作 3 git add 命令参数 4 git add 背后做了什么 1 前言 众所周知 git 中有工作区 暂存区 版本库三大组成部分 工作区 电脑中能看到的目录 也就是写代码的地方 暂存区 英文叫 st