git中的暂存区有什么用

2024-01-20

我对 git 很陌生。

我刚刚了解了工作目录和暂存区域的概念。

我不太清楚暂存区的用途。

如果暂存区域不存在并且我们可以直接从工作目录提交到本地存储库,可能会出现什么问题?

抱歉,如果我的问题很愚蠢。

谢谢并致以问候, 京东


你的问题一点也不傻。它是构建整个 Git 大厦的少数几个基本概念之一。

  • The 工作目录是您工作的实际位置,您可以在检出文件时看到它们,其中包含(除其他外).git子目录。这将形成您的 git 存储库,以及远程存储库的本地副本(如果您最初克隆了它)。
  • The index是 Git 实际跟踪的文件列表:它由一个单一的平面二进制文件组成,其中包含固定大小的条目.git子目录,简单命名index。这意味着位于工作目录中且 Git 未明确遵循的所有文件将始终保持不变。

您还需要知道 Git 是snapshot基于SCM系统:每次修改文件时,都会重新完整记录。 Git 不会记录版本之间的差异(至少在现阶段不会)。因此,每个提交都是由引用每个提交的当前版本的树状文件列表形成的。

这就是索引开始变得聪明的地方:当您使用以下命令将文件添加到跟踪列表时git add,您不仅仅是将其名称和路径添加到索引中:Git 还将其当前内容保存在一个对象中,从而开始构建实际的即将到来的提交的有效负载。当你这样做时git commit,git 只是将该索引的内容保存为新修订版。这就是使de facto该索引是一个“暂存区”。

这会产生几个后果:

  • 新提交中实际记录的实际上是文件的状态,就像您所做的那样git add, not git commit ;
  • 您可以轻松决定实际提交的内容:您不必提交自上次提交以来修改过的每个跟踪文件;
  • 要确定存储库的状态,git 只需要比较工作目录、索引和最后一次提交(实际上是 HEAD 当前引用的状态)的状态。

我们可以通过以下方式总结最后一点:

  • 所有工作目录、索引和上次提交都引用相同的文件内容:存储库是最新的:
  • 索引和提交是相同的,但工作目录包含不同的文件内容:已经进行了一些修改,需要添加:“未暂存的更改”;
  • 工作目录和索引相同,但与上次提交不同:已进行一些修改并已标记为记录:“暂存更改”;
  • 所有三个实体都是不同的:一些修改已更改,但自上次调用以来您已再次修改文件git add(这仍然完全合法)或者您根据补丁块执行了部分添加git add -p仅选择文件中感兴趣的内容:“暂存更改”和“未暂存更改”都显示在git status.

最后,这提供了最后但并非最不重要的优点:由于修改检测基于文件内容而不是其上次修改时间,因此您可以轻松取消所做的操作。当文件“不小心”回到开始时,它会自动消失git status's list.

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

git中的暂存区有什么用 的相关文章

  • Git worktree prune - 它有什么作用?

    我在用着git 版本 2 14 2 windows 2并调用 git worktree add
  • 显示其 diff 包含特定字符串的所有提交

    正如标题所说 我想找到每个差异包含特定字符串的提交 目前 我使用 git log p filename 它显示了不太像每个差异的界面 我在其中搜索字符串 然后我回溯以找到实际的提交消息 简单的替代方案可能是将 git log p 通过管道传
  • 如果不是最新的,则阻止 git Push 发送整个存储库

    相关问题 为什么 Git 每次推送 origin master 时都会发送整个存储库 https stackoverflow com questions 1381403 why does git send whole repository
  • 如何使用 vim 作为寻呼机设置彩色 git diff

    我无法配置 git 来遵循我的请求 使用 vim 作为差异分页器 在交互模式下添加文件时保留差异颜色 My gitconfig setup color ui auto diff false pager diff vim 通过此配置 交互模式
  • 测量大型源树中的“接近度”

    作为我之前提出的问题的一部分找到两个来源之间的最佳匹配 https stackoverflow com questions 13898659 finding what git commit some code spawned from 其中
  • libgit2 返回:Refspec 'refs/heads/origin/HEAD' 在 TortoiseGit 中未找到错误

    启动 TortoiseGit 时出现此错误 无法获取所有参考文献 libgit2 返回 未找到 Refspec refs heads origin HEAD 虽然很烦人 但这并不妨碍我使用 TortoiseGit 然而 我想让它消失 因为它
  • git 查找胖提交

    是否可以获取有关每次提交中的更改浪费了多少空间的信息 以便我可以找到添加了大文件或大量文件的提交 这一切都是为了尝试减少 git repo 的大小 变基并可能过滤提交 你可以这样做 git ls tree r t l full name H
  • 无法使用 Git Bash 对 Visual Studio Team Services 进行身份验证

    由于身份验证失败 我无法对 Visual Studio Team Services VSTS 上的远程存储库运行任何命令 我可以通过 Visual Studio 进行拉取等操作 但只能通过 Visual Studio 不通过 Git Bas
  • Git 合并删除文件

    这是第二次发生这种情况 当我进行合并时 我后来意识到正在合并的分支中的一些文件不再位于正在合并的分支中 最新的例子是我们有一个功能分支 我一直在合并主开发分支中的更改 合并后我们丢失了很多文件 并且它们现在不存在于功能分支中 为什么会出现这
  • IntelliJ Git 集成 - git --version 空输出

    我目前正在尝试使用 IntelliJ 2016 2 的 Git 集成 但每当我将其指向可执行文件时 我都会遇到以下问题 这在技术上并不会阻止集成工作 但它确实会导致更新索引等问题 我正在运行 Windows 7 完全全新安装 但我在以前的
  • 在单独的终端屏幕上显示 git diff 和 git log 输出

    设置新的开发环境后 我遇到了一个奇怪的 git 行为 我不记得过去见过 我习惯于git diff and git log在终端中创建一个新屏幕并在其中显示其输出 什么less默认情况下 我用它作为我的寻呼机 然后我可以退出并返回到之前的终端
  • GIT:无效路径“.editorconfig”

    从 master 克隆项目时出现以下错误 错误 无效路径 editorconfig 致命 无法签出工作树 警告 克隆成功 但结账失败 您可以使用 git status 检查签出的内容 并使用 git Restore source HEAD
  • 中止 `git stash apply` [重复]

    这个问题在这里已经有答案了 我很遗憾应用了存储 错误的分支 我如何撤消此操作并将我的存储返回到我的存储列表 以便稍后将其应用到正确的分支 如果你还没有承诺 你应该能够git stash再次 可能与git reset HEAD first A
  • 使用 git filter-branch 然后 git push --force 清除大文件后,远程(Gitlab)上的 Git 存储库大小仍然很大

    我已按照 Gitlab 文档中有关 使用 Git 减少存储库大小 的说明进行操作 通过从历史记录中清除大文件 https docs gitlab com ee user project repository reducing the rep
  • git log 不按时间顺序排列

    我在一个公共项目 B2G 又名 FirefosOS 上意外发现 git log 输出不是按时间顺序排列的 git clone https git mozilla org releases gecko git git log graph fo
  • Git 会删除空文件夹吗? [复制]

    这个问题在这里已经有答案了 我已提交一个项目并将其推送到我的 GitHub 帐户 该项目包含以下部分文件结构 server conf some files java lib java 和 lib 文件夹为空 从 GitHub 下载我的项目时
  • Git Push 远程:致命:包超出允许的最大大小

    我接到了一个大项目 客户想将其添加到github 我是一点一点添加的 然后发生的事情是我太贪心了 一次添加了太多文件 现在 无论我尝试什么 我都会不断收到此错误 我怎样才能解决这个问题 我试图回滚 但也许我做错了 git push Ente
  • 仅将单个文件放入 git 子模块/存储库中

    我在 git 源代码存储库中有一个特定文件 其中包含生产设置 密码 我想限制此文件 以便只有制作团队的成员才能看到它 但是 我想控制它的变化 我考虑过在 git 中使用子模块 然后限制对新存储库的访问 然而 git 似乎需要子模块的整个子目
  • 在 git 中管理 schema.rb 的首选方法是什么?

    我不想添加schema rb to gitignore 因为我希望能够从该文件加载新的数据库架构 然而 保持检查状态会导致各种虚假冲突 而这些冲突很容易通过新的解决方案解决 db migrate reset 基本上我想要一种方法 将 sch
  • 名称和电子邮件在 Git 的每用户配置文件中设置,但 Git 仍使用默认生成的名称和电子邮件

    标题已经说了 但我会更彻底地解释一下 我已使用以下命令按照建议配置了用户名和电子邮件 git config global user name git config global user email 我可以通过执行以下操作来验证这是设置的g

随机推荐

  • 如何获取更改前的属性值? (在 QML 中)

    我想了解以下问题 如何在声明式中存储属性的先前值 QML语言 任务是在属性值更改之前将其记住为另一个属性 问题在于现有的信号机制onPropertyNameChanged 该机制在修改后发出有关属性更改的信号 并且在这个处理程序中 不可能获
  • 如何从 java fx 应用程序打开默认系统浏览器?

    我正在尝试从 javafx 在默认系统浏览器中打开一个 web url 我没有找到任何关于此的官方文档 有什么线索吗 编辑 我发现了教程 http blog ngopal com np 2011 02 09 open default bro
  • MySQL DROP 所有表,忽略外键

    有没有一种简单的方法可以从 MySQL 数据库中删除所有表 忽略其中可能存在的任何外键约束 我发现生成的 drop 语句集很有用 并建议进行以下调整 将生成的 drop 限制到您的数据库 如下所示 SELECT concat DROP TA
  • SQL:标记哪个 WHERE 条件匹配

    这是一个理论问题 我想知道是否有一个好的方法来找出 WHERE 语句中的哪个条件匹配 假设我有一个这样的查询 SELECT FROM table WHERE COND1 OR COND2 AND COND3 OR COND4 有什么方法可以
  • pytest:如何创建专用测试目录

    我想要以下项目结构 folder tests project 我们来写一个简单的例子 test pytest tests test sum py t pytest sum py init py 总和 py def my sum a b re
  • JComboBox设置标签和值

    是否可以为a设置一个值和一个标签JComboBox所以我可以显示标签但获得不同的值 例如在 JavaScript 中我可以这样做 document getElementById myselect options 0 value access
  • 添加头文件的 CMake 构建错误 - 致命错误:找不到文件

    我在 Ubuntu 14 04 中使用 CMake 构建 C 源文件 我有一个主要源文件 这包括一个头文件 其中包含另一个源文件中的函数 我的主要源文件是 DisplayImage cpp 头文件是 Camera h 其中包含源文件 Cam
  • Javascript 在分配给其他变量时丢失上下文

    为什么在 javascript 中 如果您将对象方法引用到某个变量 它会丢失该对象上下文 找不到任何链接来解释幕后发生的事情 除了这一篇指出 this 指的是 拥有 该方法的对象 http www sitepoint com what is
  • 在 Android App Bundle 中添加 SwitchCompat 后,找不到资源错误 res/drawable/abc_switch_thumb_material.xml

    我知道这个问题已经被问过好几次了 我已经阅读了所有这些问题 并匹配了所有依赖项 以便它们具有相同的版本 但是这个错误只有在添加 Switch Compat 之后才开始发生 因为您还可以通过查看 Fabric 的崩溃报告来看到这一点 此错误并
  • 尝试启动我的应用程序时出现“没有适当的协议错误”

    我已经使用带有 SSL 证书的 nginx 代理在临时环境和生产环境中成功运行了一个 Spring Boot Web 应用程序几个月了 突然间 昨晚当应用程序尝试发送邮件消息时 当我尝试连接到邮件服务器时 我开始在生产服务器中看到错误 在尝
  • Google Sites API + OAuth2(在 Appengine 上)

    我一直在尝试利用 Python 库来访问 Google Sites API 第一步需要用户授权我们的应用程序 他们建议使用 OAuth2 并且他们提供了一个可以找到的库here http code google com p google a
  • 将桌子分成两半

    无论如何 是否可以使用 CSS 将表格分成两半并并排显示两个部分 例如 采取这个 row1 row1 row1 row2 row2 row2 row3 row3 row3 row4 row4 row4 row5 row5 row5 并做这个
  • 什么是纯 Java [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我受邀参加 Pure Java Developer 面试 请帮助我理解什么是纯Java 找不到任何有关它的信息 纯Java代码是这样的代码 符合
  • 在 Haskell 中基于新类型(“包装类型”)构建函数的惯用方法是什么?

    Let StringWrapper1 and StringWrapper2是包裹字符串的两种类型 即newtype StringWrapper1 StringWrapper1 String and newtype StringWrapper
  • 导入错误:没有名为 6 的模块

    我正在尝试构建 OpenERP 项目 并完成依赖项 现在出现这个错误 Traceback most recent call last File openerp client py line 105 in
  • 理解 PyTorch 中使用backward()的梯度计算

    我试图了解基本的 pytorch autograd 系统 x torch tensor 10 requires grad True print tensor x x backward print gradient x grad output
  • 使用 javascript/jquery 查找链接目标是否为图像

    我正在尝试编写一个脚本来找到所有 a 目标是 jpg gif 或 png 的标签 并向它们附加一个函数 a filter function return this href match probably some regex here bi
  • 如何根据姓名和 ID 计算 C 列中的“否”?

    我有 3 列 A B C Name ID Report 在 A 列中我有名字 可以重复 在 B 列中 我有 ID 可以为不同的名称重复使用相同的 ID 在 C 列中 我有 是 和 否 可以对同一 ID 重复使用 否 我需要帮助来计算 Joh
  • 在 Android 寻呼机中隐藏应用程序标题栏

    Can anyone tell how to hide the app title bar in Pager fragment 这应该足够了 ActionBar bar getActionBar you might need to use
  • git中的暂存区有什么用

    我对 git 很陌生 我刚刚了解了工作目录和暂存区域的概念 我不太清楚暂存区的用途 如果暂存区域不存在并且我们可以直接从工作目录提交到本地存储库 可能会出现什么问题 抱歉 如果我的问题很愚蠢 谢谢并致以问候 京东 你的问题一点也不傻 它是构