合并冲突后暂存区中有哪些文件?

2024-04-21

我运行时与 file1.txt 发生冲突git merge b2当前分支是master.

ls-files -somcdt file1.txt然后显示:

M 100644 4111d50ada6cc03ec6079f226c23efa3142c9c94 1     file1.txt
C 100644 4111d50ada6cc03ec6079f226c23efa3142c9c94 1     file1.txt
M 100644 74a940a72da050886c6d46ca46270b990a5b12bd 2     file1.txt
M 100644 0d02047f8540dc3f81ed8645a9d912479e731d83 3     file1.txt
C 100644 0d02047f8540dc3f81ed8645a9d912479e731d83 3     file1.txt

Blob 4111似乎是两个分支在分道扬镳之前的共同版本。

Blob 74a9是版本中的master分支和斑点0d02是版本中的b2 branch.

在此上下文中,标签 C 和 M 意味着什么?


这个输出很奇怪,部分原因是我认为有点错误git ls-files (not enough不过,我并不清楚我会采取什么不同的做法,也许可以为该错误添加一个额外的列C信,拉git status --short有两列状态字母?)。特别是,当您使用-t选项你会得到一个状态标志,但是当你使用-m标记你得到一个额外的线C某些文件的状态(工作树副本与索引副本不匹配的文件)。这意味着您可以看到一个文件名两次。

但在这里,您看到的是一个文件名五次。你会看到它three次,除了这个-m标记插入额外的行(两次)。这让我们想到了您在标题中提出的问题:

合并冲突后暂存区中有哪些文件?

这就是术语的所在暂存区有点崩溃了。大多数情况下,它是一个比无意义的词更好的术语index或过度使用(因此毫无意义)的词cache: the 暂存区保存文件暂存以供提交。这就说得通了。但是当发生合并冲突时,索引/暂存区/缓存中的文件aren't根本就是“为提交而上演”,所以这个术语暂存区现在只是错误的。在这种情况下,我想回到第一个无意义的术语“索引”。

这里真正的关键是暂存槽号,它出现在 blob 哈希 ID 之后、文件名之前:

4111d50ada6cc03ec6079f226c23efa3142c9c94 1 file1.txt

这些“暂存槽编号”允许一个文件在索引/暂存区域中多次出现:每个条目都有不同的槽位号,这允许我们使用 Git 访问它:1:file.txt, :2:file.txt, and :3:file.txt语法(在git rev-parse / git 修订版 https://git-scm.com/docs/gitrevisions).

当暂存区域未出于合并目的而扩展时,“正常”槽号始终为零。 (尝试git ls-files -s当不在冲突的合并过程中时。)零槽文件已正确暂存并准备好提交。您可以访问此“副本”(实际上是 blob 实例):file.txt使用 gitrevisions 语法。

Blob 4111似乎是两个分支在分道扬镳之前的共同版本。斑点74a9是版本中的master分支和斑点0d02是版本中的b2 branch.

这是正确的,这就是这里的想法。更准确的说法是,槽 1 中的文件是位于槽 1 中的文件。合并基础提交。槽 2 中的文件来自提示提交当前分支的master,即从当前提交,槽 3 中的文件来自正在合并的提交,即尖端提交b2.

这正是问题的核心git merge在进行真正的合并时有效:

  • Git 找到要合并的两个提交。其中之一是当前或HEADcommit,另一个是你在命令行命名的提交(git merge b2).

  • Git 使用存储的元数据in这两个提交,以及在早期的提交中发现via这两个提交,以找到公共起点提交。

  • Having thus located exactly three commits,1 the merge can now begin:

    • Git 将合并基础提交读取到“槽 1”处的索引中。
    • Git 将当前提交读取到“槽 2”处的索引中。请注意,自从git merge要求一切都是“干净的”,这相当于moving每个 slot-0 条目到一个 slot-2 条目。
    • Git 将另一个提交读取到“槽 3”处的索引中。

    现在我们有了每个文件的所有三个实例in索引,在三个槽中。下一步是弄清楚最终合并文件的外观是否有快捷方式。

作为一种优化,这个“捷径”步骤实际上很早就发生了,没有大量的索引条目创建和洗牌,但我们可以假装它没有。请记住,合并的目标是合并更改,如果我们有某个文件的三个副本,它们可能是全部相同,或者其中两个可能匹配,我们可以采取以下捷径:

  • 如果所有三个副本都匹配,则使用任何副本。没有人改变任何事情,所以我们完成了! (到此为止,不要继续剩下的测试。)
  • 如果合并基础副本与我们的副本匹配,请使用他们的副本。我们没有触及该文件,而他们却触及了,因此合并结果是他们的文件。
  • 如果合并基础副本与他们的副本匹配,请使用我们的副本。他们没有触及文件,而我们触及了,所以合并结果就是我们的文件。
  • 如果我们的副本和他们的副本匹配,请使用以下副本之一:我们都制作了相同的变化到文件,所以任何一个都可以工作。
  • 三份副本都不匹配:我们需要做真正的、实际的、努力的工作。

如果快捷方法找到正确的结果文件,则合并代码将移动that将文件的版本复制到插槽 0,擦除其他两个插槽的条目,并且如果需要,还更新文件的工作树副本。该文件现已完全合并,无需发生任何其他事情。

如果采用捷径方法fails要找到正确的结果文件,合并代码将所有三个文件保留在索引中,在这三个插槽中。然后它使用更多代码 - 您可以自己运行相同的代码,使用git merge-file https://git-scm.com/docs/git-merge-file,如果您愿意的话,尝试进行完整的三向合并,将您所做的更改与他们所做的更改结合起来:

  • 这个完整的三向合并可以succeed,在这种情况下,合并的文件位于工作树中,并且合并代码执行内部操作git add将此副本写入索引的槽 0,这也会擦除槽 1-3。

  • 或者,这个完整的三向合并可以fail,在这种情况下,合并attempt工作树中是否存在完整的冲突标记,并且合并代码不执行任何操作(除了记住将合并称为“冲突”)。

合并代码重复此操作每个文件在三个暂存槽中。忽略所有的other特殊情况——例如检测重命名或处理新的或删除的文件,或脚注 1 中提到的项目——这涵盖了所需的一切。最后,要么所有文件都已合并并且所有内容现在都位于插槽零,要么合并发生冲突并且git merge停下来并让你收拾残局。

在此上下文中,标签 C 和 M 意味着什么?

M means unmerged,即槽号不为零。这就是它的全部意思,所以-s,这个标志有点无用,因为你可以只看槽号。

C means changed,即该文件与工作树副本不匹配。


1What do we do if there aren't exactly three commits?

这种情况以多种不同的方式发生。一种明显的方法是 Git 的所谓章鱼合并,你运行的地方:

git merge b1 b2 b3

to merge three other branch tips with the current (HEAD) commit to make a four-parent merge commit. This kind of merge is done by the git-merge-octopus strategy, which doesn't use the index in the same way at all, and generally does not permit the kinds of conflicts that we'd try to resolve with git merge-file. So that one, fortunately, sidesteps all of this. Explaining how git-merge-octopus actually works is ... tricky, especially since I don't understand the octopus merge base computation myself.2

但即使使用两次提交作为输入合并,自动合并基础查找也可能存在问题。 Git 将合并基础定义为最好的共同祖先,使用最低公共祖先算法作为 DAG 的扩展。该算法描述为维基百科上的这里 https://en.wikipedia.org/wiki/Lowest_common_ancestor#Extension_to_directed_acyclic_graphs带有示例图。节点 x 和 y 的 LCA 不仅仅是one节点,而是two。在这种情况下,git merge-base --all将找到这两个“最佳共同祖先”提交。 (一般来说,在足够复杂的图中,可能有很多合并基。由于交叉合并,两个合并基的情况肯定会时不时地出现。)

目前,Git 对于这个问题有两个答案:

  1. Using git-merge-resolve,我们选择one of the N合并基地,并假装这是唯一的合并基地。
  2. Using git-merge-recursive,我们选择all合并碱基,并将它们与git merge。这会生成一个新的临时提交,然后我们将其用作原始问题的合并基础。

使用方法2时,将合并基进行合并可以再次找到多个合并基;如果是,Git 会合并这些合并基础,并使用生成的临时提交作为合并两个合并基础的合并基础。这反过来又可以递归,但由于每个 DAG 都会“蚕食”DAG,所以递归肯定会终止。

(新的git-merge-ort代码——尚未在任何已发布的 Git 版本中标准使用;如果你有的话,你必须打电话索取-s ort——据我了解,执行相同类型的递归,但我没有查看代码本身。)

2Running git merge-base --octopus can do one computation for you, and running git merge-base without --octopus can do another computation for you. These produce different results. I never delved enough into the octopus strategy code to figure out whether it uses one of these two algorithms, or perhaps even some third algorithm.

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

合并冲突后暂存区中有哪些文件? 的相关文章

  • Git:如何使外部存储库和嵌入式存储库作为通用/独立存储库工作?

    我有一个大项目 比方说A repo 其中有一个子文件夹来自B repo 当我提交时 我会遇到如下警告A repo warning adding embedded git repository extractor annotator serv
  • Git 命令显示我对给定远程的权限

    同事可以从远程存储库获取数据 但不能推送到远程存储库 我怀疑他对遥控器只有读权限而没有写权限 我可以通过多种方法来检查这一点 但我想不出他可以在 git 中使用的方法 是否有 git 命令可以显示给定远程存储库的权限 No Git 本身不处
  • 有没有办法缓存 https 凭据以推送提交?

    我最近转而将我的存储库同步到 GitHub 上的 https 由于防火墙问题 并且每次都要求输入密码 有没有办法缓存凭据 而不是每次都进行身份验证git push 自 Git 1 7 9 2012 年发布 以来 Git 中有一个巧妙的机制可
  • 如何使用 .gitattributes 避免在 git root 中包含文件夹,但在 zip 的 dist 文件夹中包含同名文件夹

    我有一个名为lib在存储库的根目录和另一个名为lib在 dist 文件夹中 我正在尝试使用 gitattributes文件排除除 dist 之外的所有文件夹和文件 以便任何下载为 zip 或 tarball 的人都只会 git 分发文件 我
  • git 可以与 Xcode 集成吗?

    有没有办法将 git 存储库与 Xcode 内置的 SCM 功能一起使用 Xcode 4 原生支持 git WWDC 2010 上的开发者工具国情咨文演讲 在这里了解更多 Xcode 4 中的新增功能 http developer appl
  • Git 不断提示我输入密码

    我已经使用 Git 一段时间了 但是不断要求输入密码开始让我感到厌烦 我使用的是 Mac OS X 和 GitHub 并且按照 GitHub 的说明设置了 Git 和我的 SSH 密钥设置 Git 页面 http help github c
  • 推送时发生 Git 错误 - update_ref 失败

    当我尝试推送本地提交时遇到问题 这可能是在 Android Studio 崩溃时发生的 这是错误 update ref 引用 refs remotes origin master 失败 无法锁定 ref refs remotes origi
  • IntelliJ:查看本地和 git 提交/分支之间所有已更改文件的差异

    使用 IntelliJ 的 diff 查看器是检查代码的一种非常好的方法 因为您可以使用 IntelliJ 代码编辑器的所有功能 重构 完成等 在本地版本中进行更改 不幸的是 我还没有弄清楚当你在 IntelliJ 中进行代码审查时如何做最
  • 如何解决 VSTS 中拉取请求中的合并冲突?

    我已经创建了拉取请求 我进入了这个 批准 按钮不执行任何操作 并且 完成 被禁用 如何解决拉取请求中的冲突 Update 微软刚刚添加了基于浏览器的合并 这可能会让你摆脱小冲突的困境 并提供自 Sprint 150 起改进了不同场景的可视化
  • git diff - 只显示哪些目录发生了变化

    有没有办法只列出已更改的目录 如果我在 git root 的话 project 我更改的文件是 project subtool file1 project subtool file2 project subtool3 file1 我只是想
  • git 匹配多个单词的标签

    我们可以得到最后一个 git 标签 它以一个单词 例如 TEST 开头 如下所示 git describe tag dirty match TEST 我想知道如何获得最后一个以 word1 开头的标签orword2 例如测试OR跑步 我尝试
  • 如何合并两个连续的 git 存储库

    我有一个相当独特的情况 我有一个名为 Project1 的存储库 我在其中工作了一些时间 几个月 一年后 我创建了存储库 Project1 Again 从 Project1 停止的地方开始 现在 我希望修订历史记录是连续的 因此我希望它们合
  • 默认情况下 git merge -Xignore-space-change

    我该如何设置该选项ignore space change对于所有合并使用git config 我也许可以使用别名merge 但因为我希望该设置应用于git stash pop git stash apply git pull and git
  • Git - 创建拉取请求而不分叉

    使用 git 已经有一段时间了 关于 git pull request 有很多教程和解释 其动机是什么等等 我遇到两种情况 1 分叉 git 仓库 我查看了一些公共 git 存储库并决定我想要做出贡献 所以我 通过以下方式创建重复的存储库F
  • VS 2015 + Bower:在防火墙后面不起作用

    Problem 在 Visual Studio 2015 中 使用 Bower 我的包在防火墙后面时恢复失败 并出现类似以下内容的错误 ECMDERR 无法执行 git ls remote tags heads git github com
  • 我可以直接从我的谷歌云端硬盘在线推送/拉取吗?

    有一些方法可以通过谷歌驱动器同步 Windows 应用程序将我的本地 git 存储库同步到我的谷歌驱动器 但我想知道我是否可以完全绕过它的需要 Fro eg git remote add origin https drive google
  • 在 Azure DevOps 项目之间移动存储库时保留拉取请求

    我在同一帐户内有两个 Azure DevOps 项目 我想将存储库从一个项目移动到另一个项目 这一页探索如何在具有完全保真历史记录的团队项目之间移动 git 存储库 https learn microsoft com en us azure
  • 如何将工作树与提交进行比较?

    我在用着 git diff mycommit 用于比较我的工作树mycommit 但它似乎忽略当前索引中不存在的文件 您可以按如下方式重现它 git init echo A gt A txt git add git commit m A g
  • git 日志历史记录图,每次提交一行,彩色,带有日期

    我需要的格式如下 git log decorate graph oneline date order 但我也需要它 包含日期 短 具有相同的颜色 I tried git log decorate graph oneline date ord
  • GIT:以下未跟踪的工作树文件将被签出覆盖

    我有两个分支 一个称为 master 另一个称为 dev 我目前位于 master 分支 我想转到 dev 分支将文件移动到开发服务器 但是当我执行 git checkout dev 我收到消息 以下未跟踪的工作树文件将被覆盖 查看 pag

随机推荐

  • 使用 PHP 的 HTTP PUT、DELETE 和 I/O 流

    除了 HTTP PUT 方法之外 还有什么方法可以访问通过 HTTP PUT 方法发送的数据 putdata fopen php input r 我从未与PUT and DELETE方法和 putdata fopen php input r
  • 使用图形 api 在 sharepoint online 中创建多选字段的 POST 正文是什么?

    我正在尝试使用 Microsoft Graph 创建新的 SharePoint ListItem 要创建包含标题等简单字段的列表项 我的 POST 正文如下所示 fields Title Ehsan s REST 但是一旦我添加一个具有多选
  • 使用 Ionic core 4 时不会显示离子含量

    我正在开发一个使用 Vue js 和 Ionic 的应用程序 但我不明白为什么更新我的 Ionic 核心版本会破坏 ion content 标签 我尝试谷歌搜索该标签是否已停用 但似乎没有是这样的 为了说明这一点 我制作了一个使用 Ioni
  • 如何测试模块的运行块

    我希望我的 AngularJS 应用程序发出 http 请求以从服务器检索用户信息或重定向到登录屏幕 我在应用程序主模块的运行块中实现了这一点 但是如何在运行块中测试代码呢 或者我应该将此初始化代码移到控制器中以使其可测试 我正在使用 Ka
  • 从 Excel 到 SQL Server 的数据导入无法导入所有数据

    我在使用导入和导出数据工具将数据从 Excel 导入到 SQL Server 时发生了一件奇怪的事情 缺点是我可以在Excel中看到数据 但所有数据都没有导入 我有一本 Excel 工作簿 其中包含一个电子表格 我可以看到列中的数据 一切看
  • 如果没有收到请求的响应,会发生什么情况?我看到重试

    我认为我遇到的问题可能更多是与浏览器相关的问题 但它是一个非常基本的问题 当我冒险构建一个 Web 应用程序时 我也想找到答案 在我的客户端代码中我正在做一个 ajax称呼 这篇文章可能需要一段时间才能回复 我看到的是在一段时间后再次发送请
  • 在选定的数据范围内创建数据分区,将其输入到 caret::train 函数中以进行交叉验证

    我想为下面的数据框创建折刀数据分区 这些分区将用于caret train 像caret groupKFold 产生 然而 问题是我想将测试点限制为超过 16 天 同时使用这些数据的其余部分作为训练集 df lt data frame Eff
  • 如何用Python为ElasticSearch创建只读客户端?

    我想从 ES 读取数据 但不想意外向其中写入数据 无索引操作 这只是一种安全措施 以便以后修改查询函数的其他人不允许插入数据 当你说你想要只读客户端时 客户端强调您系统中的同一集群可能有其他客户端 然后阻止整个索引为只读将会阻止所有客户端的
  • 在Linux上运行MFC程序

    我有一个相当大的基于 MFC 的程序 我的任务是让它在 Linux 上运行 我已经解释过 这需要将程序重新编写为带有 STL 的直接 C 更多工作 或者重新编写为 Qt C 更少工作 现在我被告知 我需要编写包装器以使每个 MFC 类在 L
  • 如何在 Jupyter 中启用 R 语法突出显示?

    我希望为 Jupyter 编写的 R 代码添加语法突出显示 准确地说 语法高亮超出了数字 文本等已有的语法高亮 我的设置 Packges 康达R 3 2 4 康达版本 4 0 6 Jupyter版本4 1 0 在带有 Chrome 的 Wi
  • 如何更改Exception对象的异常消息?

    所以我捕获了一个异常 Exception 类的实例 我想要做的是更改其异常消息 我可以得到这样的异常消息 e gt getMessage 但如何设置异常消息呢 这是行不通的 e gt setMessage hello 对于几乎所有的情况 您
  • SelectSingleNode 返回 null - 即使有命名空间

    我知道以前曾以类似的方式问过这个问题 但我似乎无法解决这个问题 我有一些 xml
  • 如何允许多个参数为空值

    我在 SSRS 报表生成器中的报表有多个参数 如果不需要选择 我希望所有参数都允许空白值 但是当我尝试运行报告时 第一个参数将允许空 空白值 并且它将提示我输入其余参数 有没有办法解决 Set Allow Blank Value and o
  • 如何遵守自制协议?

    我有一个带有委托属性的类 任何想成为代表的人都必须遵守协议 我这样定义一切 import
  • Android 调用另一个类的方法

    我知道这个问题重复了 但我在互联网上找不到答案 我想调用另一个类的方法 我有Class1和Class2 在第2类中我有这个方法 public void UpdateEmployee some code 我想从Class1调用上面的方法 感谢
  • 理解 scala 中参与者的线程性

    有人告诉我 Scala Actors 实际上从来不会同时执行两个操作 这表明 act 或 React 或 receive 方法本质上是同步的 我知道 act 方法中的长操作可能会导致阻塞问题 并且我假设对消息队列的访问必须以某种方式同步 但
  • Rails 路由中的“mount”指令是什么意思?

    我找不到关键字 mount 的含义轨道布线系统 http api rubyonrails org classes ActionDispatch Routing html 我已经设置了Mercury http jejacks0n github
  • 如何使用multiple属性在Android上上传多个文件?

    I got a
  • 在 python 上使用 TensorRT .engine 文件进行推理

    我使用 Nvidia 的迁移学习工具包 TLT 进行训练 然后使用 tlt converter 将 etlt 模型转换为 engine 文件 我想使用这个 engine 文件在 python 中进行推理 但由于我使用 TLT 进行训练 因此
  • 合并冲突后暂存区中有哪些文件?

    我运行时与 file1 txt 发生冲突git merge b2当前分支是master ls files somcdt file1 txt然后显示 M 100644 4111d50ada6cc03ec6079f226c23efa3142c9