为什么一个存储表示为 2 次提交?

2024-01-06

当存储一些更改时,Git 会创建两个单独的提交,“分支上的 WIP”和“分支上的索引”:

$ git log --graph --all 

*   commit 98aac13303ca086580c1ec9ccba5fe26c2a8ef3c
|\  Merge: 7d99786 82c5c76
| | Author: Tieme <[email protected] /cdn-cgi/l/email-protection>
| | Date:   Wed Nov 19 09:58:35 2014 +0100
| |
| |     WIP on development: 7d99786 Last real commit
| |
| * commit 82c5c763357c401135675a39bfabf9b7f6805815
|/  Author: Tieme <[email protected] /cdn-cgi/l/email-protection>
|   Date:   Wed Nov 19 09:58:35 2014 +0100
|
|       index on development: 7d99786 Last real commit
|
|
| * commit 7d9978637a0e1ef92f2432189bdebf2317f0b2f0
| Author: Tieme <[email protected] /cdn-cgi/l/email-protection>
| Date:   Tue Nov 18 17:32:33 2014 +0100
|
|     Last real commit
|

我查了一下文档 https://www.kernel.org/pub/software/scm/git/docs/git-stash.html为此,但它并没有使它更清楚:

存储表示为提交,其树记录了工作目录的状态,其第一个父级是创建存储时位于 HEAD 的提交。第二个父级的树记录了存储时索引的状态,并且它成为 HEAD 提交的子级。祖先图如下所示:

         .----W
        /    /
  -----H----I

其中H是HEAD提交,I是记录索引状态的提交,W是记录工作树状态的提交。

为什么我更改的文件创建了 2 个提交,而不只是一个?


简短回答

git stash区分索引上的更改和工作树中的更改,并为它们创建提交。

长答案

一些背景

使用 git,工作树(直接使用的文件)中的更改可能与索引上的更改不同。

仅将有限数量的文件添加到索引,或者使用git add --patch即使在文件中添加单个更改行也会使索引处于与工作树不同的状态。
这是一件好事,因为它使您能够创建专注于某个特定任务/功能的提交。

甚至有可能您对索引进行了更改,而这些更改不再是工作树的一部分。您可以通过向索引添加一些更改来测试它(git add),手动从文件中删除它们,然后创建一个提交(git commit).
提交仍将包含您首先添加的更改,尽管它们不再存在于您的工作树中。

如果您无法理解工作树和索引之间的区别,您可以看看这个问题 https://stackoverflow.com/questions/3689838/difference-between-head-working-tree-index-in-git.

究竟发生了什么?

现在,一开始的说法应该更有意义了。一个“存储提交”包含您在工作树(您直接使用的文件)中所做的所有更改,另一个包含您添加到索引中的更改。

默认情况下git stash pop or git stash apply只尝试恢复您在工作树中所做的更改,并忽略您对索引所做的更改。 可以说git stash也尝试使用以下命令恢复索引--index flag (git stash (pop|apply) --index).

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

为什么一个存储表示为 2 次提交? 的相关文章

  • Git 提交失败:“请使用 -m 或 -F 选项提供消息。”

    当我键入 git commit 命令来提交文件时 我收到以下错误消息 Microsoft Visual Studio 微软 找不到命令 错误 核心编辑器 Microsoft Visual Studio 存在问题 请使用 m 或 F 选项提供
  • Git difftool 未启动外部 DiffMerge 程序

    我一直遵循 戴夫的博客条目 http www davesquared net 2009 05 setting up git difftool on windows html 链接在此answer https stackoverflow co
  • Git 到 TFS 源代码管理迁移

    我想看看 TFS 如何为我的命令工作 所以我想将我们当前的 GIT 存储库移动到 TFS 数据库 我们使用 GIT 来获得普遍的分支支持 因此我想使用 TFS 2010 来解决该问题 现在的问题是 如何将 GIT 存储库导出到 TFS 显然
  • Git 更改丢失 - 为什么?

    我们的开发团队正在使用 git 最近我们至少两次丢失了文件更改 我们正在使用私人 Github 存储库 在当前情况下 我们可以返回 Github 上的日志并查看我对文件所做的一些更新 后来 另一位团队成员更改了文件的不同部分 它似乎破坏了我
  • VSTS:在构建过期的情况下自动变基/合并和重新排队构建验证门

    我们最近对 PR 上的构建验证门进行了更改 这样 如果另一个提交在当前 PR 完成之前进入主分支 则构建会 立即 过期 看here https stackoverflow com questions 49418800 vsts invali
  • 如何使用git-svn切换svn分支?

    复制 如何让 git svn 使用特定的 svn 分支作为远程存储库 https stackoverflow com questions 192736 how do i make git svn use a particular svn b
  • 如何使用 git 比较不​​在存储库中的两个文件

    我想比较两个不在任何 git 存储库中的 css 文件 git中有这样的功能吗 git的 diff 比标准 Unix 更实用diff 我经常想这样做 并且由于这个问题在谷歌上排名很高 所以我希望这个答案出现 这个问题 如何使用git dif
  • 如何创建名称中带有正斜杠的标签

    当我已经有了类似的标签时 有什么方法可以创建名称中带有正斜杠的 git 标签吗 假设我有 1 16 0 标签 并且我想创建 1 16 0 1 0 0 标签 git tag 1 16 0 1 0 0 error refs tags 1 16
  • 为 RHEL 6 安装/构建 git-svn

    我无权访问 RHEL6 存储库 那么在 RedHat Enterprise Linux 6 上构建和 或安装 git svn 工具的最佳方法是什么 通过卸载现有的 yum擦除git 并从源安装最新的来设法安装git和git svn 1 7
  • Git:如何正确合并两个功能完全不同的分支?

    想象一下这样一种情况 同一个项目有两个分支 第一个分支的一部分对另一个分支进行了大幅重构 但有一段时间 您需要保持两个分支的功能 因此您需要对两个分支进行错误修复和关键功能添加 有时是以不对称的方式 在某些时候 您必须将重构的分支合并到原始
  • 有没有办法导入/导出容器绑定脚本

    我有一个插件 它使用 appscripts gs 以及 html js 和 css 文件 目前我们所做的是我们有一个参考 Google 文档 其中有一个脚本项目包含所有这些源代码 但是除了手动复制和粘贴之外 没有办法在 GIT 中保留源代码
  • Git checkout 不会丢弃我的更改

    我在 Windows XP 上使用 git 1 7 1 和 cygwin 这个问题可以通过例子得到最好的说明 git status On branch master Changed but not updated use git add
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • 如何在GIT中构建标签树?

    作为 GIT 的频繁用户 我喜欢git log graph尽我所爱git tag 我负责一个大型 GIT 存储库 其中有太多分支和标签 而且我的处理速度太慢西西弗斯式的 https en wikipedia org wiki Sisyphu
  • git push --force-with-lease 总是安全吗?

    我一直遵循的规则是 一旦 git 历史记录被推送到远程存储库 就不再修改它 但我想知道交互式变基到推送 force with lease 是否绕过了这条规则 如果强制租约成功 对其他用户来说是否完全安全 或者此策略有任何注意事项吗 预先感谢
  • 使用 git 子树时如何添加特定文件夹?

    我正在开发一个复杂的 Ionic 项目 我正在开发的许多组件和提供程序都是通用的 可以在我公司正在进行的其他项目中使用 这在软件开发中很常见 这是我提出的 Git 工作流程 该图显示了分支 my company library repo c
  • BitBucket 应用程序密码:git 命令行访问有哪些权限?

    我了解如何为 BitBucket 创建应用程序密码 如中所述Atlassian 的应用程序密码信息 https support atlassian com bitbucket cloud docs app passwords and 这个答
  • 如何在 Visual Studio 2013 中使用 Git 的外部 diff 工具?

    我找到了这个帖子 http architects dzone com articles how configure diff and merge这解释了如何让 Visual Studio 2013 在比较 Git 中的文件时使用内置 dif
  • 使用 git 合并两个截然不同的分支?

    我有我的master分支和我的verydifferentbranch它们有相同的祖先 大约 300 次提交前 现在verydifferentbranch功能完整我想把它放在master下面branch 进行变基会导致每个补丁都有很多合并冲突
  • Gitlab 备份错误:包对象因信号 9 死亡

    我有一个存储库 有 2 个分支 大小为 3 5GB 每个分支大约 1 5GB git 本身就有 700MB 这是错误 备份失败 失败的 失败 opt gitlab embedded bin git git dir mountdata git

随机推荐

  • Google Cloud Datastore JSON API 的 datasetId 是什么

    正如中提到的this https stackoverflow com questions 25097451 how do i find my datasetid for making google datastore queries ans
  • 以编程方式构建 msbuild 15 项目

    我正在尝试构建一个使用 VS2017 创建的简单 C 7 类库项目 框架程序集的 MSBuild 已经过时了 所以我引用Microsoft Build Microsoft Build Engine and Microsoft Build F
  • 当按下回车键时如何转到下一个文本框?

    大家好 我正在学习 Javascript 我想问你们 当我按下键盘上的 Enter 按钮输入文本后 如何才能转到下一个文本框 谢谢 您可以使用 keyup 跟踪用户何时完成字符输入并e keyCode获取按下了哪个键 如果是 13 意味着进
  • 如何提高这段代码的性能呢?

    我正在尝试学习一些 Julia 在阅读了几个小时的手册后 我编写了以下代码 ie 200 ez zeros ie 1 hy zeros ie fdtd1d steps for n in 1 steps for i in 2 ie ez i
  • Doxygen:是否可以控制依赖图的方向?

    Up until today I d been using an ancient version 1 4 7 of doxygen dot and it typically drew graphs with a vertical orien
  • 比较 Msbuild 中的日期时间戳

    我正在尝试比较 msbuild 中的两个日期时间戳 我做了以下事情
  • Visual C++ __forceinline 奇怪的行为

    我试图强制 Visual C 编译器内联特定函数 我知道inline or forceinline只是一个建议 根据MSDN https msdn microsoft com en us library bw1hbe6y aspx 如果编译
  • 如何正确使用MouseMotionListener来按下JButtons?

    我制作了一个小型康威生命游戏程序 我已经完成了大约 80 我用过一个网格JButtons作为细胞 现在我有一个ButtonListener在每个按钮上 因此您必须通过单击各个按钮来逐一绘制您想要的图案 我希望能够快速单击并拖动鼠标并选择按钮
  • request.is_ajax() == 点击后退按钮时为 True?

    我有一个 Django 应用程序 它根据页面请求是否为 Ajax 返回不同的响应 当我查看页面 导航到其他地方 然后单击后退按钮时 请求将被呈现为就像request is ajax 是真的 因此 JSON 输出显示在浏览器中 而不是生成的
  • python 获取 json 键作为完整路径

    我想解析一个 JSON 文件并获取包含访问密钥所需的所有路径的完整列表 如果我们使用keys方法 我们会得到单个键的列表 但不会得到访问数据所需的分层键的完整列表 所以如果给定数据这样 data glossary title example
  • Elm 与 ClojureScript 相比如何?

    我已经到了这样的地步 使用 Backbone js 面向对象的 MVC 模式进行 GUI 编码变得非常复杂 并且正在考虑其他范例 MDV https github com Polymer TemplateBinding FRP http e
  • 为什么通过weak_ptr调用这么慢?

    我已阅读问题weak ptr 的性能损失是什么 https stackoverflow com questions 2748091 whats the performance penalty of weak ptr但我自己的测试显示出不同的
  • 单击圆圈时启动一个功能 - 传单

    我在里面画了一些圈JS如下 L circle 46 765735535841024 23 58344078063965 5 color blue addTo map bindPopup Description This is my desc
  • ScrollController 附加时的事件

    一旦我获得有关最大滚动范围的信息 我就会尝试显示一个小部件 如果我分配一个实例 我可以找到该数字ScrollController to the controller可滚动小部件的属性 我的问题是ScrollController在构建过程中附
  • 使用 jquery 切换 () 和 animate()

    这是一个超级简单的问题 我基本上知道我想要什么以及如何去做 我只是不确定在某个部分使用什么选择器 如果我去掉toggle 函数 动画效果很好 但它只能打开菜单 不能关闭菜单 这是我的 jquery 代码 document ready fun
  • 显示mongodb索引内容

    建立索引后 我想查看索引的内容 以 MonboDB 文档为例进行说明 id ObjectId name Warm Weather author Steve tags weather hot record april 那么标签字段上的索引将具
  • 复合文字中缺少类型

    type A struct B struct Some string Len int 简单的问题 如何初始化这个结构体 我想做这样的事情 a A B Some xxx Len 3 预计我会收到错误 missing type in compo
  • sql语句中的减法

    这个SQL语句合法吗 SELECT firstName lastName FROM Presidents WHERE endTerm beginTerm gt 4 我需要找到任期超过 4 年的总统 我可以在此查询中使用 吗 如果没有 什么是
  • 分布式事务完成。在新事务或 NULL 事务中登记此会话

    只是好奇是否有其他人遇到此特定错误并知道如何解决它 场景如下 我们有一个使用 Enterprise Library 的 ASP NET Web 应用程序 该应用程序运行在连接到 SQL Server 2008 群集后端的 Windows S
  • 为什么一个存储表示为 2 次提交?

    当存储一些更改时 Git 会创建两个单独的提交 分支上的 WIP 和 分支上的索引 git log graph all commit 98aac13303ca086580c1ec9ccba5fe26c2a8ef3c Merge 7d9978