草庐IT

Git帮助理解 merge 基础冲突

coder 2023-06-25 原文

我在未修改的文件上遇到冲突。 merge 时更改一行的文件发生冲突。我开始了解可能发生的事情,但仍然无法解决问题。

这是分支结构。

  • 大师
  • 当前_迭代
  • mapr_autoinit

  • Master 已经很老了,并且已经有很长一段时间没有从 current_iteration 中进行更改了。然而,master 通过将其他 base 直接重设到 master 上,直接应用了更改。所以在技术上 master 和 current_iteration 有分歧。我们一直对 current_iteration 进行分支和标记。我看到的问题是,当我从 current_iteration merge 回我的分支时。根据对 current_iteration 的更改,我得到的冲突比应该发生的要多。我能够从 current_iteration 执行 git diff/git apply 并且它应用得很干净。

    当我运行 git show-branch --merge-base在 mapr-autoinit 上,我看到提交实际上是几个月前在 master 上的提交。但是,当我查看 git merge-base current_iteration mapr_autoninit 时我看到该版本是最新的,很可能不会有冲突。

    从我最近几天看到的情况来看,如果我将 master merge 到 current_iteration 中,提交然后将 current_iteration merge 回 master 似乎是合乎逻辑的。这可能应该解决我的分支 merge 基础指向更新的版本。

    也有可能我可以停止跟踪大师。我尝试使用 git config --unset branch.master.merge; git config --unset branch.master.remote停止跟踪大师,但这并没有解决我的问题。

    这是否是 master 和 current_iteration 出现分歧并且 merge 试图通过重放整个日志来协调 merge 的问题?

    这里还有更多细节。我现在提出一个新问题,因为这个问题更加具体。我将使用有效答案更新两者或删除旧答案,具体取决于首选答案。

    Git merge resulting in unreasonable conflicts

    最佳答案

    我从来没有找到git show-branch输出我自己非常有用,我不确定它是如何使用的,也不知道其他人如何成功使用它。

    Also is it possible that I could stop tracking master ...



    这无关紧要。重要的是实际的提交图。任何分支的上游都独立于提交图。

    Is this a problem where the master and current_iteration have diverged and merge is trying to reconcile the merge by replaying the entire log?



    不。在 merge 基础发现之后重要的是—— merge 基础提交,即——加上两个分支提示提交。两者之间的一切都无关紧要。

    However when I check git merge-base current_iteration mapr_autoinit I see that the version is very recent and most likely would not have conflicts.



    这通常是开始的方式,因为 git merge-base检查提交图,并使用它来计算 merge 基础提交。请注意 git merge默认情况下运行等效于 git merge-base --all .如果这产生了多个 merge 基础(多个提交哈希 ID),那么您将遇到一种特殊情况。让我们假设您现在没有,但检查一下是个好主意。

    找到了merge base commit,可以查看git log输出(请参阅最后一节)并查看 merge 基础如何与两个分支提示相关联。 Git 并不关心这个——嗯,这不太正确:在 Git 找到 merge 基础(取决于这个)之后,Git 不再关心它——但你可能会发现它很有帮助。

    找到了 current_iteration 的(单个) merge 基础和 mapr_autoinit (并假设您在这两个分支之一上),这是 Git 的作用:
    git diff --find-renames <merge-base-hash> current_iteration > /tmp/1
    git diff --find-renames <merge-base-hash> mapr_autoinit > /tmp/2
    

    我将这些重定向到 /tmp此处的文件以便于多次查看和并排查看或其他方式,具体取决于您的文件查看器。因为我不知道你从哪个方向 merge ——从什么,到什么——我只是给这两个文件编号,而不是称它们为“我们的”和“他们的”。请注意,无论如何,组合更改步骤在很大程度上是对称的。对于每个文件的每次更改,有四种可能性:
  • 您触及了线条而它们没有:Git 接受您的更改。
  • 他们触及了线条而你没有:Git 接受他们的改变。
  • 你和他们触碰了线条,但你做出了同样的改变:Git 复制了一份改变。
  • 你和他们触及了线条,但做了不同的更改:Git 声明了 merge 冲突,并将两组更改放入工作树文件中。如果您设置 merge.conflictStylediff3 ——我强烈推荐这个 ——Git 也包括 merge 基础版本,向你展示你和他们在你之前开始的内容以及他们做出的相互冲突的更改。

  • 查看结果,包含 merge 冲突标记和通过 merge.conflictStyle 包含的基本版本设置为 diff3 ,通常就足够了。 (特别是,它有时会显示 Git 错误配对更改并认为它们冲突的情况,而实际上更改是针对其他不冲突的区域。)如果不是,查看提交图可能会有所帮助。

    关于提交图的更多信息

    确实有效,但很难理解的东西,1 是 git log --graph 的输出.包含 --decorate --oneline 很有帮助选项,对于这种特殊情况,您需要列出当前分支 2 的名称和要 merge 的分支的名称。例如,如果您有 mapr_autoinit checkout 并打算运行 git merge master ,你可以运行:
    git log --graph --decorate --oneline mapr_autoinit master
    

    Git 将尽最大努力在 ASCII 艺术中绘制提交图,并添加可选的额外颜色来帮助。当然,结果很大程度上取决于图中的内容。这是 Linux 内核 Git 存储库中的一个片段:
    * 1ffaddd029c8 (HEAD -> master, tag: v4.18-rc8, origin/master, origin/HEAD) Linux 4.18-rc8
    *   a8c199208cd6 Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    |\  
    | * 1b3a62643660 x86/boot/compressed/64: Validate trampoline placement against E820
    * |   2f3672cbf9da Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    |\ \  
    | * | 0a0e0829f990 nohz: Fix missing tick reprogram when interrupting an inline softirq
    | * | 80d20d35af1e nohz: Fix local_timer_softirq_pending()
    * | |   0cdf6d4607df Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
    

    人们可以使用它来跟踪自 merge 基础以来发生的事情。还有更多工具:
    git log --graph --decorate --oneline --boundary mapr_autoinit...master
    

    例如,将显示未 merge 的内容(标记为 * 的提交),加上(由于 --boundary )已 merge 的边界提交(标记为 o 的提交),但没有比这更深入的图表。

    对于非常简单的情况——内部分支和重新 merge 并不可怕的图形——添加 --left-right三点语法有时也很有帮助。对于复杂的情况,每条腿都有很多内部分支和 merge 操作,--first-parent有时很有用,而且 --simplify-by-decoration有时很有用。

    1尽管如此,它仍然值得细读。如果您愿意,可以使用 GUI 或类似的工具来更漂亮地绘制图形,但请注意,至少某些 Git GUI 似乎绘制了不正确的图形 (coughvariouscoughwebservicescough)。

    2您始终可以只使用名称HEAD , 全部大写,代替当前分支名称。例如,全小写适用于 Windows 和 MacOS 上不区分大小写的文件系统,但养成这种习惯并不好。孤独的标志 @意味着 HEAD但是,在任何现代 Git 中,如果您愿意,可以使用它而不是拼写 HEAD .请注意,当使用两个或三个点语法( A..BA...B )时,完全省略一个名称也意味着 HEAD :HEAD..B , @..B , 和 ..B是同一事物的三个拼写。

    关于Git帮助理解 merge 基础冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51713876/

    有关Git帮助理解 merge 基础冲突的更多相关文章

    1. ruby-on-rails - 在默认方法参数中使用 .reverse_merge 或 .merge - 2

      两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option

    2. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

      我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

    3. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

      只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

    4. postman接口测试工具-基础使用教程 - 2

      1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

    5. 软件测试基础 - 2

      Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

    6. CAN协议的学习与理解 - 2

      最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

    7. git使用常见问题(提交代码,合并冲突) - 2

      文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

    8. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

      Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

    9. ES基础入门 - 2

      ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

    10. ruby - 易于初学者理解的 Ruby 库 - 2

      关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5

    随机推荐