Я пытаюсь выполнить трехстороннее слияние для фиксации выбранной вишни, используя 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
Мой вопрос:
- Какой смысл имеет помеченная стрелка, указывающая на файл "LOCAL"?
- Как отключить эту "функцию" (баг?)? Это довольно раздражает при слиянии больших файлов, когда Meld отмечает большой блок кода «BASE» и хочет вставить его в «LOCAL» файл.
- Если это имеет смысл - зачем мне менять файл "LOCAL"? Согласно этому посту SO: Какая версия git-файла будет использоваться в конечном итоге: ЛОКАЛЬНАЯ, БАЗОВАЯ или УДАЛЕННАЯ? панель "ЛОКАЛЬНАЯ" должна быть открыта в режиме только для чтения. У меня есть приблизительное представление о файлах "LOCAL", "REMOTE", "BASE" и "MERGED", однако рассматриваемый вариант Meld мне непонятен.
--theirs
(или REMOTE), а текущим коммитом является коммит--ours
(или LOCAL). И LOCAL, и REMOTE действительно должны быть доступны только для чтения (и на самом деле BASE тоже должен быть, но, возможно, здесь объединены BASE и MERGED). - person torek   schedule 26.05.2020