Понимание Meld 3 способа слияния, изменения направления потока

Я пытаюсь выполнить трехстороннее слияние для фиксации выбранной вишни, используя Meld. Однако мне трудно понять направления, в которых происходят изменения между тремя файлами, показанными Meld. Чтобы дать лучшую иллюстрацию, давайте рассмотрим следующий случай:

В основной ветке на коммите 4e623e0 у нас есть отслеживаемый файл с именем 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, поэтому мастер ветки находится на коммите 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. Если это имеет смысл - зачем мне менять файл "LOCAL"? Согласно этому посту SO: Какая версия git-файла будет использоваться в конечном итоге: ЛОКАЛЬНАЯ, БАЗОВАЯ или УДАЛЕННАЯ? панель "ЛОКАЛЬНАЯ" должна быть открыта в режиме только для чтения. У меня есть приблизительное представление о файлах "LOCAL", "REMOTE", "BASE" и "MERGED", однако рассматриваемый вариант Meld мне непонятен.

person maxnorbi    schedule 26.05.2020    source источник
comment
Сам по себе meld не является частью Git: это стороннее дополнение. Git действительно заботится только о том, что бы ни делал инструмент слияния, он в конечном итоге записал правильно объединенный файл в файл в вашем рабочем дереве. Это, по-видимому, раньше называлось объединенным в слияние (основываясь на этом другом ответе), но теперь, по-видимому, просто показано посередине (опять же, очевидно: у меня нет или использовать слияние). По-видимому, ваша версия meld начинается с базового файла в качестве конечного результата и заставляет вас щелкать стрелки, чтобы внести любые изменения из локальных и/или удаленных файлов.   -  person torek    schedule 26.05.2020
comment
@torek - я в порядке, внесу изменения. Чего я не понимаю, так это внесения изменений.   -  person maxnorbi    schedule 26.05.2020
comment
Опять же, я предполагаю, но: Держу пари, что часть внесения изменений на самом деле означает после внесения изменений передумать и решить не вносить изменения. То есть щелчок по этой стрелке, указывающей влево, не будет иметь никакого эффекта. Вероятно, это ошибка даже в том, чтобы отображать эту стрелку в этой точке; он должен отображаться только после того, как вы внесли изменение. (В противном случае посередине также должны быть стрелки, указывающие вправо.)   -  person torek    schedule 26.05.2020
comment
Между прочим, большая часть этого имеет гораздо больше смысла в обычном слиянии. Выбор вишни — это странный вид слияния, в котором родителем выбираемого коммита является коммит --theirs (или REMOTE), а текущим коммитом является коммит --ours (или LOCAL). И LOCAL, и REMOTE действительно должны быть доступны только для чтения (и на самом деле BASE тоже должен быть, но, возможно, здесь объединены BASE и MERGED).   -  person torek    schedule 26.05.2020


Ответы (1)


Вишневый выбор - интересная ситуация для конфликта. LOCAL (левая панель) — это код той версии, в которой вы находитесь (другими словами: HEAD). Теперь местные и УДАЛЕННЫЕ приобретают особое значение. При обычном конфликте при слиянии этот интерфейс (я полагаю, я этого не знаю) покажет вам кончик другой ветки на правой панели и код, как он есть (примерно) на последнем общем предке в центральная панель, где вы можете редактировать внешний вид файла и прочее.

При выборе вишни то, что показывают эти два раздела, немного отличается (на самом деле это одно и то же, но выбор вишни — это другой вид слияния). Панель REMOTE (правая панель) покажет вам код в том виде, в котором он находится в ревизии, которую вы выбираете (поэтому у вас есть ifs, как в ветке other).... середина панель представляет собой код в том виде, в каком он отображается в родительской ревизии, которую вы выбираете (поэтому она показывает код так, как он выглядел в первой ревизии).

person eftshift0    schedule 26.05.2020
comment
К сожалению, я до сих пор не понимаю смысла модификации ЛОКАЛЬНОГО файла. В конце концов, что он должен делать? Изменить коммит в HEAD? - person maxnorbi; 26.05.2020
comment
Вы могли бы сделать это, если бы захотели... но нет, не обычно. Файл LOCAL фактически является вашей отправной точкой, даже если пользовательский интерфейс не делает его слишком очевидным. Предположим, вы попытались сделать резервную копию версии проекта, которая очень устарела. Как будет выглядеть код? Какой смысл показывать вам родителя ревизии, которую вы выбираете (центральная панель), и результат ревизии (правая панель), если вы не представляете, как на самом деле выглядит код на ревизия у вас должна на самом деле работать? Это не будет летать. - person eftshift0; 26.05.2020