【问题标题】:Undestanding Meld 3 way merge change flow directions了解 Meld 3 路合并更改流向
【发布时间】:2023-03-19 16:49:01
【问题描述】:

我正在尝试使用 Meld 为樱桃挑选的提交完成 3 路合并。但是,我很难理解 Meld 显示的 3 个文件之间的更改流向。为了更好地说明,让我们考虑以下情况:

在提交 4e623e0 的 master 分支上,我们有一个名为 test.c 的跟踪文件,它看起来像这样:

#include <stdio.h>

int main()
{
        printf("Hello world!\n");
        return 0;
}

我们创建分支'other',并将更改提交到test.c,因此分支other位于提交29771b0,test.c文件如下所示:

#include <stdio.h>
#include "foo.h"
#include "headerx.h"
#include "headery.h"
#include "headerz.h"

int main()
{
        printf("Hello world!\n");
        if (x(2) > x(3))
                return -1; 
        else if (z(2) > z(3))
                return 44; 
        return 0;
}

现在我们回到分支'master',并将更改提交到test.c,所以分支master在commit 02fd8c8,test.c文件看起来像这样:

include <stdio.h>
#include "foo.h"
#include "bar.h"

int main()
{
        printf("Hello world!\n");
        return bar_fun(2);
}

最后,在master分支上,我们尝试做

git cherry-pick 29771b0
git mergetool

然后出现以下窗口:

我的问题是:

  1. 指向“LOCAL”文件的标记箭头有什么意义?
  2. 如何关闭此“功能”(错误?)? 合并大文件时相当烦人,当 Meld 标记一大块“BASE”代码并希望将其推送到“LOCAL”文件中时。
  3. 如果它确实有意义 - 我为什么要更改“本地”文件? 根据此 SO 帖子:Which version of the git file will be finally used: LOCAL, BASE or REMOTE?,“本地”窗格应以只读模式打开。我对“LOCAL”、“REMOTE”、“BASE”和“MERGED”文件有一个粗略的了解,但是考虑的 Meld 选项对我来说没有意义。

【问题讨论】:

  • meld 本身不是 Git 的一部分:它是一个第三方插件。 Git 只真正关心无论合并工具可能做什么和做什么,它最终都会将正确合并的文件写入工作树中的文件。显然曾经在meld中被称为“合并”(基于其他答案),但现在显然只是显示在中间(再次,显然:我不拥有或使用融合)。显然,您的 meld 版本从作为最终结果的基本文件开始,并强制您单击箭头以从本地和/或远程文件中引入任何更改。
  • @torek - 我很好,有“引入”的变化。我不明白的是,“带出”变化。
  • 我再次猜测,但是:我敢打赌,“带出”更改部分实际上是指“在引入更改后,改变主意,并决定不引入变化”。也就是说,单击该向左箭头将不起作用。在那个时候甚至显示那个箭头可能是一个错误;它应该仅在您带来 in 更改后显示。 (否则中间也应该有向右的箭头。)
  • 顺便说一句,这在普通合并中更有意义。樱桃挑选是一种奇怪的合并,其中被挑选的提交的父级是--theirs(或远程)提交,而当前提交是--ours(或本地)提交。 LOCAL 和 REMOTE 都应该是只读的(实际上 BASE 也应该是只读的,但也许它在内部结合了 BASE 和 MERGED)。

标签: git git-cherry-pick meld


【解决方案1】:

挑挑拣拣是一种有趣的冲突情况。 LOCAL(左窗格)是您所在版本上的代码(换句话说:HEAD)。现在,local 和 REMOTE 有了非常特殊的含义。在合并的正常冲突中,此界面(我假设,我不知道)将向您显示右侧窗格中另一个分支的尖端以及(大致)位于最后一个共同祖先上的代码中心窗格,您可以在其中编辑文件的外观和内容。

在樱桃精选上,这两个部分显示的内容有些不同(实际上,它们是相同的,但樱桃精选是一种不同的合并)。远程窗格(右窗格)将向您显示您正在挑选的修订版上的代码(这就是为什么您在 other 分支上拥有 ifs 的原因)......中间窗格是出现在您正在挑选的修订版的 上的代码(这就是为什么它以第一个修订版上的方式显示代码的原因)。

【讨论】:

  • 不幸的是,我仍然不明白修改“LOCAL”文件的意义。毕竟,它应该怎么做?在 HEAD 处修改提交?
  • 如果你愿意,你可以这样做......但是,通常不会。 LOCAL 文件实际上是您的起点,即使 UI 并没有使其太明显。假设您尝试在非常旧的项目修订上反向移植修订。代码会是什么样子?如果您不知道代码在修订你应该实际工作?那不会飞。
猜你喜欢
  • 2012-08-24
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 2016-08-27
相关资源
最近更新 更多