【发布时间】: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
我的问题是:
- 指向“LOCAL”文件的标记箭头有什么意义?
- 如何关闭此“功能”(错误?)? 合并大文件时相当烦人,当 Meld 标记一大块“BASE”代码并希望将其推送到“LOCAL”文件中时。
- 如果它确实有意义 - 我为什么要更改“本地”文件? 根据此 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