gpt4 book ai didi

Git merge diff3 样式需要说明

转载 作者:IT王子 更新时间:2023-10-29 01:01:16 25 4
gpt4 key购买 nike

我 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 共同祖先输出区分开来。

    conflict with merged common ancestor blurred

    aaaaaahhhhhh,那好一点。 ;-)

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

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

    merged common ancestor conflicts, grouped

    有了这个特定的 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com