恢复 git merge 冲突标志

2023-12-28

我正在尝试找出一种与团队其他成员共享合并冲突的方法。我们有一些非常大的分支,合并它们会产生很多冲突。我尝试了几种不同的方法,我当前的尝试包括将处于冲突状态的文件推送到远程存储库(将合并标记留在文件中),然后运行一个烦人的长别名来 grep 通过文件并重新创建手动合并文件(LOCAL、BASE、REMOTE)。

我最近发现了

git checkout --conflict=merge --(文件)

命令,该命令在本地分支上运行良好,但是一旦将其推送到远程分支,该命令就不再能够恢复合并标志。

有没有办法强制 git 将文件重新标记为冲突,以便人们可以使用普通的合并工具来解决它们?


有没有办法强制 git 将文件重新标记为冲突,以便人们可以使用普通的合并工具来解决它们?

不,无论如何,如果不编写自己的代码就不行。 (应该有人写一些代码,也许应该是这样——是时候为此拥有一个工具了。不过,有很多极端情况很难。)

这里的问题是,在 Git 中,冲突的合并由存储在 Git 中的状态表示。index.

退后一步,让我们定义索引以及当前提交 or HEAD, and 工作树(或工作树、工作树和一堆类似的变体):

  • 当前提交,也称为 HEAD 或HEAD,非常简单。 (我喜欢用HEAD,在这样的计算机文本布局中,特指 Git 名称HEAD。您还可以使用@在 Git 版本 1.8.5 或更高版本中。这个特殊的名字指的是当前分支,如果存在当前分支,则当前分支定位到提示提交该分支的当前提交。或者,在“分离头”模式下,HEAD直接包含当前提交的哈希ID。无论哪种方式,这都会命名当前提交。)

  • The 工作树很简单,就是您工作的地方。 Git 保存提交和文件版本副本的内部数据结构不适合其他用途,因此 Git 将版本提取到普通文件中,然后您可以像往常一样读取和操作。

    工作树还可以保存您尚未提交且不想提交的文件。这些都是未追踪的文件。 (从技术上讲,未跟踪的文件是工作树中尚未存在于index,但我们还没有定义索引。 :-) )

    Git 往往会抱怨未跟踪的文件未被跟踪;您可以通过列出文件或其路径名模式来关闭这些投诉.gitignore文件。注意添加文件名.gitignore does not使文件不被跟踪。如果文件被跟踪,它将保持跟踪状态。这.gitignore条目主要只是关闭投诉,并且还使 Git 不会自动add当您说“添加所有文件”时,这些未跟踪的文件。

  • The index位于两者之间。通常,当您第一次签出提交或分支时,索引内容与HEAD提交内容,Git 也会将其提取到工作树中。然后,您可以随意修改工作树,但索引仍然与 HEAD 匹配。你必须git add文件将它们从工作树复制回索引。

    因此,该指数本质上代表了下一次提交你会做的。当你跑步时git commit,Git 将索引变成新的提交(自动成为新的 HEAD 提交)。仅限您复制回来的内容into索引被提交,这意味着您可以将更改拆分为多个提交,只需git add一次处理几个文件。 (并且,您可以使用git add -p仅添加part文件的而不是整个文件的,因此索引版本本身位于 HEAD 提交版本和工作树版本之间。)

如果您从未进行任何合并,或者从未发生任何合并冲突,我们可以在此停止并完成索引。当然,您正在进行合并,并且它们遇到了冲突,因此我们需要仔细观察。

该索引每个索引条目有四个“阶段槽”

索引通过工作树中的路径名记录文件。如果您修改其中一些文件,并且git add它们为下一次提交做好准备,这会更新文件的索引版本。但如果你跑步的话就会发现一个秘密git ls-files --stage在冲突合并期间。这种情况通常不会在其他时间出现——仅在冲突合并期间出现。秘密在于每个文件在索引中最多可以存在三次, in 舞台槽位已编号的。插槽 0 是正常的日常插槽:

$ git ls-files --stage
[snip]
100644 d8d18736e74c7a5f61d794770a2dd94786501d12 0   Makefile
100644 046dcab7645305cbf4b94adef54a859234ac3caa 0   README
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0   lib/__init__.py

全零值列表示这些文件中的每一个都位于槽零中。

但是,在冲突合并期间,README,或其他名称之一,在槽 1、2 和 3 中最多可以有三个条目。在这种情况下,Git 知道存在合并冲突。插槽 1 保存文件的合并基础版本。插槽 2 容纳HEAD or --ours版本,插槽 3 保存MERGE_HEAD or --theirs同一文件的版本。 (根据定义,插槽 0 此时未被占用。)

其中几个插槽可以是空的。 (我曾经说过,最多其中一个可以为空,但我错了:在重命名/重命名或重命名/删除冲突时,我们实际上可以看到多个空槽。)一个或多个空槽表明no文件在合并的三个输入中的一个或多个中具有该名称。的存在any不过,编号较高的条目表示正在进行冲突的合并。

正如您所看到的,解决这些冲突是您的工作。指定文件的工作树版本通常包含 Git 迄今为止解决合并的最佳尝试,但由于 Git 无法解决冲突,因此工作树版本中包含冲突标记。解决冲突后,您应该运行git add像往常一样在路上(或git rm如果解决方案是删除该文件)。这会清除较高阶段的插槽,同时还将工作树文件复制到插槽零,除非该文件确实被删除。现在冲突已经解决了。

如果您正处于合并过程中,尚未提交结果,并且已编辑甚至解析了文件,但希望将其恢复到原始未合并状态,则如您所述,您可以使用:

git checkout -m -- <path>

(或与--conflict)。你可以加=<style>,它允许您指定冲突样式:merge or diff3(我更喜欢diff3,其中包括文件合并基础版本中的文本)。这将删除第 0 阶段条目(如果您创建了第 0 阶段条目),并恢复更高阶段的冲突条目。这种特殊的形式git checkout, 尽管,requires原始未合并的条目在索引中可用。

无论如何,你cannot进行新的提交,直到所有较高阶段的索引条目都得到解决。也就是说,如果git ls-files --stage显示任何条目not阶段零,您可能无法进行新的提交。

...一旦它被推送到远程,这个[git checkout -m] 命令不再用于恢复合并标志。

事实上,那是很久以前的事了。一旦你做出承诺,恢复冲突的能力就会消失。这将永久清除所有高级索引条目。但是您无法推送索引,也无法推送文件:您只能推送提交。这意味着要推送部分合并(让其他人处理它),您必须解析合并并提交。现在它已不再进行,也无法再进行。

我们需要一个可以保存完整索引状态、工作树文件、合并状态(包括两次提交的 ID)的工具HEAD and MERGE_HEAD—这意味着合并基础的 ID — 甚至可能是未跟踪和/或忽略的文件(a lagit stash)到存储在非分支引用上的特殊提交或一组提交。然后可以将该提交或这些提交从一个存储库转移到另一个存储库。同一工具的反向版本可以恢复合并状态、索引状态和工作树。构建这样一个工具所需的所有组件都存在(因为git ls-files --stage and git update-index两者都存在)。但是编写这个工具对会很复杂,可能至少和git stash script.

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

恢复 git merge 冲突标志 的相关文章

  • 致命:无法将 HEAD 解析为有效引用

    我正进入 状态fatal Failed to resolve HEAD as a valid ref 每当我尝试承诺时 我努力了 echo ref refs heads master gt git HEAD 但它不起作用 也尝试过 git
  • 按时间顺序将多个文件夹提交到 git 中

    我有数百个网站备份 每个文件夹一个 我想将它们放入 git 存储库中 每个备份作为一个版本 这些变化主要涉及图像文件和每天 2 个数据库备份 大小约为 25 GB 并且不断增加 有没有办法告诉 git 获取其中一个文件夹并将其提交到存储库中
  • 在centos上设置jenkins:ssh密钥和git的问题

    经历了很多问题 但似乎没有什么能解决我的问题 或者更准确地说 我不确定我是否正确地完成了整个事情 所以这里是 已安装centos 6 3操作系统 然后我按照以下指南安装詹金斯 https wiki jenkins ci org displa
  • 从自己的 gitlab 服务器安装节点模块

    我想从我们的 gitlab 服务器安装节点模块 这是存储库的链接 http ABCD GITLAB myGroup myNodeModule git http ABCD GITLAB myGroup myNodeModule git 根据n
  • 您的分支比“origin/master”领先 3 个提交

    我在运行时收到以下信息git status Your branch is ahead of origin master by 3 commits 我读过其他一些帖子 解决这个问题的方法是运行git pull rebase但是 rebase
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • git-svn 如何知道要提交到哪个分支?

    我的存储库是 SVN 我使用 git 进行所有开发 我们有一个标准布局 我用以下命令初始化了我的本地存储库git svn init s
  • Jenkins GIT 包含从未构建过的区域

    我正在尝试使用包含区域在 Jenkins 中构建我的工作 但每当选中此选项时 民意调查结果总是说未检测到任何更改 我尝试了许多不同的路径 以及使用工作区进行 不进行强制轮询 结果是轮询从未检测到任何更改 但一旦我删除这些选项 它们就会在下一
  • SSL 适用于浏览器、wget 和curl,但不适用于 git

    我有一个网站 用于托管 redmine 和几个 git 存储库 这非常适合 http 但我无法使用 https 进行克隆 即 git clone http mysite com git test git 工作正常 但是 git clone
  • 将 Visual Studio 在线 Git 存储库集成到 Android Studio 1.0.2

    我正在使用 Visual Studio Online 进行开发过程 我想将我的 Android Studio 1 0 2 代码集成到其中 但是 据我所知 Android Studio 没有 TFS 插件 这就是为什么我想使用 Git 进行源
  • Python 中字典的合并层次结构

    我有两本词典 而我想做的事情有点奇怪 基本上 我想合并它们 这很简单 但它们是字典的层次结构 我想以这样的方式合并它们 如果字典中的项目本身就是字典并且存在于两者中 我也想合并这些字典 如果它不是字典 我希望第二个字典中的值覆盖第一个字典中
  • 如何让 git 显示作者日期指定日期范围内的提交?

    显然this https stackoverflow com a 11189286 281545 git log all after
  • 如何在颠覆合并期间忽略文件夹

    我有一大堆更改需要合并到我的分支中 但我想在合并过程中忽略特定文件夹 是否可以使用 Subversion 来做到这一点 如果是这样那我该怎么办呢 编辑 我想忽略的文件夹位于存储库中 但在合并期间我不会对此文件夹进行更改 您可以像平常一样进行
  • Smartgit:自动插入提交消息

    有没有办法使用钩子脚本在 Smartgit 中自动插入提交消息 重击 如果用户提交了他的更改 我想预加载提交消息字段 我没有看到任何SmartGit配置 http www syntevo com smartgit documentation
  • 创建多个 git 分支的联合分支

    我希望能够在现有分支之上分层其他分支 并独立修改这些分支 这很有用 例如 允许将各个子项目的二进制文件统一到同一个项目中bin目录 一般来说 给定的文件仅存在于一层中 理想情况下 我想我会使用 unionfs 来完成此任务 但它必须以某种方
  • 删除 Xcode 项目的源代码控制

    我在 Xcode 项目上使用源代码控制已经有一段时间了 但现在我不想使用源代码控制 如何从 Xcode 中的项目中删除源代码控制 有三种方法 方法 1 将禁用所有项目的源代码管理 方法 2 将删除所有项目的单个存储库的链接 方法 3 将删除
  • 使用标志来识别口语

    在我正在做的网络应用程序中 我需要识别人们所说的语言 我想使用标志来做到这一点 但我有一些问题 例如 如果您说法语 则可以放置法国国旗 但如果您说英语 您可以放置 美国或英国国旗或两者的混合 阿拉伯语选择哪个标志 沙特阿拉伯国旗 阿尔及利亚
  • Git:忽略版本控制文件

    gitignore 文件对于忽略一些我们不想控制的文件非常有用 不幸的是 当文件已处于版本控制之下时 它无法使用 例如 我的 gitignore 已添加到 git 中 文件可能与我的同事想要的不同 例如我想忽略 Vim 文件 每当我对此文件
  • 在 python 中找不到 git 可执行文件

    我试图使用访问密钥克隆 git 存储库 但是当我尝试运行它时 它抛出一个异常 说找不到 git 可执行文件 但我已经安装了 git 并且 in it py 显示了正确的路径 C Program Files Git bin 我还安装了 git
  • git rebase 吃了我的提交!为我翻译“git reflog”输出?

    我已经完成了五次提交 我想在推送它们之前将它们全部合并为一次提交 出于某种原因 我决定尝试通过与通常使用的不同的方式来做到这一点 FWIW 我试图按照此处的说明进行操作http gitready com advanced 2009 02 1

随机推荐

  • 致命错误:未找到“CI_Model”类

    突然间 我的网络服务器上的页面出现故障 一切都在本地运行得很好 有问题的错误 Wed Sep 12 03 37 49 2012 error client PHP Fatal error Class CI Model not found in
  • Dart SDK 0.8.10.3_r29803 dart:js 回调

    有人可以给我一个遵循此流程的 Dart 代码示例吗 1 Dart调用Javascript函数 2 Javascript 通过 Javascript api 加载一些数据 3 Javascript返回数据给Dart 目前我只能调用我需要的Ja
  • 闪烁的托盘图标

    我知道如何使用 java 在 Windows 系统托盘中放置图标 但是执行系统托盘图标的最佳方法是什么Blinking 或者如果我可以不时或在某些事件 应用程序运行时 替换任何图标 请分享您的经验 提前致谢 在某些基础上更改图标没有问题 输
  • 在巨大的 1 和 0 列表中提取 1 密集区域的边界

    我不知道如何表达我的问题 但这里是 我有一个巨大的 1 和 0 列表 总长度 53820 列表的示例 0 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 1 可视化如下所示 x axis 元素的索引 从 0
  • 更新 MongoDB 中数组元素的值

    我想知道如何更新数组 array of stuff 中 名称 字段标识的元素之一的 值 字段 例如 我想将 name of thing 1 的值更新为 new value of thing 1 我怎样才能做到这一点ONLY使用更新命令的第二
  • 如何从 HTML 表格中删除特定单元格?

    假设我有 HTML 表格 并且我想从 HTML 表格中删除一个单元格 如下所示 我已将单元格边框颜色更改为白色 因为整个表格的边框颜色是黑色 因此它显示灰色 问题是我无法删除表格边框 所以我使用了边框折叠 折叠 那么我怎样才能改变它 使边框
  • Hive 表的 ORC 拆分生成问题

    我在 Hadoop 3 3 4 上使用 Hive 版本 3 1 3 和 Tez 0 9 2 当我创建一个包含拆分的 ORC 表并尝试查询它时 我得到一个ORC split generation failed例外 如果我连接表格 https
  • cocos2d可以调节音量吗?

    我使用以下方法 在cocos2d中表达声音效果 SimpleAudioEngine sharedEngine playBackgroundMusic BackGround m4a 但背景音乐的音量太小 那么 有没有办法调节音量呢 Simpl
  • 无法使用 Eclipse 和 Maven 让 Struts2 Hello World 工作

    该网站不允许用户向他们的教程提出技术问题 我认为该教程已损坏 http www mkyong com misc how to use mkyong tutorial http www mkyong com misc how to use m
  • std::function 无法区分重载函数

    我试图理解为什么std function无法区分重载函数 include
  • 无法加载私钥。 (PEM例程:PEM_read_bio:无起始行:pem_lib.c:648:预期:任何私钥)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个 key 文件 它是 PEM 格式的私钥文件 我没有制作这个文件 但我从某个地方得到了这个 我想使用 openssl 工具查看其
  • 如何对齐Gridview中心

    我想将 GridView 居中对齐 我还是这样 正如您在上图中看到的 我在左侧获取图像 但我想在中心显示图像 如下所示 另一件事是获得文本背景的额外宽度我如何仅在图像中显示文本背景 现在 gridview 位于中心 但仍然遇到问题 请参阅文
  • 在 Titanium 应用程序中找不到库 stlport_shared

    我想创建一个 Titanium 模块 因此我有一个扩展 KrollModule 及其方法的类 Kroll method public void example Activity activity this getActivity Strin
  • git 子模块的公共子模块

    我有一个申请main由多个子模块组成A B and utility functions 这两个子模块A and B本身包含子模块utility functions main A utility functions B utility fun
  • Tesseract-OCR 3.02 与 libc++

    Xcode 4 6 iOS SDK 6 1 tesseract ocr 3 02 由于最新的 OpenCV 版本是使用构建的libc 并且 tesseract ocr 是使用构建的libstdc 库 它们不能在一个 xcode 项目中一起使
  • 禁止用户订阅 Firebase 主题

    如何消除应用程序用户拨打电话的机会FirebaseMessaging subscribeToTopic String 为了仅在服务器端处理主题管理 Firebase 云消息传递主题是公开的 无法阻止特定用户订阅它们
  • ERRO[0043] 拨打 gRPC 失败:无法升级到 h2c,收到 501

    当我尝试使用以下命令构建 Dockerfile 时docker build t myimage1 今天我收到这个错误 ERRO 0043 failed to dial gRPC unable to upgrade to h2c receiv
  • 用lark语法识别多行部分

    我正在尝试编写一个简单的语法来解析具有多行部分的文本 我不知道该怎么做 这是我到目前为止写的语法 如果有任何帮助 我们将不胜感激 ps 我意识到 lark 对于这个问题来说太过分了 但这只是我试图解析的一个非常简化的版本 from unit
  • 调试多线程应用程序[重复]

    这个问题在这里已经有答案了 我有一个用 C 和 MFC 编写的应用程序 它在 Windows 上运行多线程 有时我确实会收到一些抱怨 例如由于这些线程而导致的死锁或未处理的异常 通常我使用 Visual Studio 如果问题可重现 或使用
  • 恢复 git merge 冲突标志

    我正在尝试找出一种与团队其他成员共享合并冲突的方法 我们有一些非常大的分支 合并它们会产生很多冲突 我尝试了几种不同的方法 我当前的尝试包括将处于冲突状态的文件推送到远程存储库 将合并标记留在文件中 然后运行一个烦人的长别名来 grep 通