草庐IT

Git merge diff3 样式需要说明

coder 2023-06-23 原文

我 merge 了 2 个分支并出现了冲突,我需要一些提示,它从哪里开始到哪里结束等等。我用一些伪造的数据替换了代码,以便于阅读和讨论。

<<<<<<< HEAD
    aaaaaa
||||||| merged common ancestors
<<<<<<< Temporary merge branch 1
    bbbbbb
=======
    cccccc
>>>>>>> mybranch
    dddddd
<<<<<<< HEAD
    eeeeee
||||||| merged common ancestors
    ffffff
||||||| merged common ancestors
    gggggg
=======
>>>>>>> Temporary merge branch 2
=======
    hhhhhh
>>>>>>> mybranch

最佳答案

您在此示例中看到的(带有 Temporary merge branch 标记)是 diff3 与交叉 merge 冲突的结果。我将用一系列定义来解释这一点。

定义

  • merge 基地 :两个 merge 分支最近偏离的提交。发生 merge 冲突时,对两个分支中的同一行进行了不同的更改。 merge 基础包含这些行在任一分支更改它们之前的内容。
  • merge 共同祖先 : diff3 输出一个额外的“中间”部分,显示它们在 merge 基础中的行。这是两个分支的起点。
  • 交叉 merge : merge 历史,其中两个分支以一种不可能是快进 merge 的方式相互 merge 。我在下面举一个例子。在交叉 merge 的情况下,有多个 merge 基地。
  • 临时 merge 分支 : 当有多个 merge 基时,diff3 尝试将它们 merge 在一起(使用临时 merge 分支)以形成一个共同的祖先,以显示在 diff3 的中间部分。这在没有冲突时无缝工作,但是当有冲突时,您会在中间 merge 的共同祖先部分中看到临时 merge 分支的冲突标记。

  • 示例交叉 merge 冲突场景

    每当两个分支在不同的时间点相互 merge 时,就会发生纵横 merge 。
    m3 *
       |\
       | \
       |  * B1
       |  |
    m2 *  * B0
       |\/|
       |/\|
    m1 *  * A
       | /
       |/
    m0 *
    

    考虑以下事件序列:
  • m0作为原点存在/翠菊
  • 我创建了一个功能分支 feature-A一次提交 A
  • m1被其他人 promise 掌握
  • 我开始一个新的功能分支 feature-B建立在 A 之上
  • 我 merge origin/master ( m1 ) 变成 feature-B .它发生冲突,我解决了它。 merge 提交是 B0 .
  • 我实现了功能 B 并将工作提交为 B1 .
  • feature-A准备发货,所以有人把它 merge 成 master .它冲突。他们解决了它,但他们的分辨率与B0中的分辨率不同。 . merge 提交是 m2 .
  • feature-B准备发货,所以有人把它 merge 成 master . git 尝试确定 merge 基础,但 m1A两者都同样有资格作为 merge 基地。 git merge m1A在临时 merge 分支中,这会导致冲突。我们在 merge 的共同祖先部分看到 diff3 输出,类似于 OP 的问题。

  • 读取输出

    关闭 diff3 后,这个 merge 冲突看起来就像这样:
    <<<<<<< HEAD
        aaaaaa
    =======
        hhhhhh
    >>>>>>> mybranch
    

    首先,使用所有额外的标记,您需要确定实际的冲突行是什么,以便您可以将其与 diff3 共同祖先输出区分开来。



    aaaaaahhhhhh,那好一点。 ;-)

    在两个冲突解决方案发生冲突的情况下,aaaaaahhhhhh是两个决议。

    接下来,检查 merge 的共同祖先的内容。



    有了这个特定的 merge 历史,有超过 2 个 merge 基础,这需要多个临时 merge 分支,然后将它们 merge 在一起。当有许多 merge 基础和冲突时,结果会变得非常复杂且难以阅读。有人说不要打扰,只需在这些情况下关闭 diff3 即可。

    另请注意,git 内部可能会决定使用不同的 merge 策略来自动解决冲突,因此输出可能难以理解。如果可以,请理解它,但要知道它不是供人类食用的。在这种情况下, merge mybranch时发生冲突进入 Temporary merge branch 1之间bbbbbbcccccc .专线 dddddd临时 merge 分支之间没有冲突。然后 merge 时单独发生冲突Temporary merge branch 2进入 HEAD ,有多个共同的祖先。 HEAD已通过 merge 解决了冲突 ffffffggggggeeeeee ,但是 Temporary merge branch 2通过删除(或移动)该行(因此 ======Temporary merge branch 2 之间没有行)解决了相同的冲突。

    你如何解决这样的冲突?虽然技术分析可能是可能的,但您最安全的选择通常是返回并查看冲突周围所有相关分支的历史记录,并根据您的理解手动制定解决方案。

    避免这一切

    这些冲突是最糟糕的,但有一些行为可以帮助防止它们。
  • 避免交叉 merge 。在上面的例子中,feature-B merge origin/masterB0 .可能不需要这种 merge 以与 master 保持同步(尽管有时是这样)。如 origin/master从未 merge 到 feature-B ,就不会有交叉 merge ,并且 m3会与 A 发生正常冲突作为唯一的 merge 基地。
    m3 *              m3 *
       |\                |\
       | \               | \
       |  * B1           |  * B1
       |  |              |  |
    m2 *  * B0   VS   m2 *  |
       |\/|              |\ |
       |/\|              | \|
    m1 *  * A         m1 *  * A
       | /               | /
       |/                |/
    m0 *              m0 *
    
  • 与冲突解决方案保持一致。在示例中,临时 merge 基冲突仅发生因为 m2B0有不同的冲突解决方案。如果他们以相同的方式解决了冲突,m3本来是一个干净的 merge 。意识到这是一个简单的交叉 merge ,应该具有相同的分辨率。其他情况可能有不同的解决方案。当 merge 点之间有 2 个以上的 merge 基础和多个提交时,事情会变得更加复杂。也就是说,如果您在纵横交错的情况下故意与冲突解决方案不一致,那么以后就会头疼。
  • 关于Git merge diff3 样式需要说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16990657/

    有关Git merge diff3 样式需要说明的更多相关文章

    1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

      当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

    2. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

      我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

    3. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

      我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

    4. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

      我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

    5. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

      我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

    6. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

      我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

    7. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

      这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

    8. spring.profiles.active和spring.profiles.include的使用及区别说明 - 2

      转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev

    9. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

      我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

    10. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

      修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

    随机推荐