Какая версия файла git будет окончательно использована: LOCAL, BASE или REMOTE?

174

Когда происходит столкновение git merge, я открываю mergetool под названием Meld . Открываются три файла LOCAL, BASE и REMOTE. Поскольку я читал, LOCAL - это моя локальная ветвь, BASE - это общий предок, а REMOTE - ветвь, которую нужно объединить.

Теперь на мой вопрос: какая версия файла будет окончательно использована? Это удаленно? Если да, могу ли я редактировать его так, как я хочу, независимо от того, что находится, например, в ветке BASE?

tsusanka
источник

Ответы:

142

Это посередине BASE.

На самом деле, BASEэто не общий предок, а незавершенное слияние, где конфликты помечены >>>>и <<<<.

Вы можете увидеть имена файлов в верхней части окна редактирования слияния.

Смотрите скриншот здесь

база слияния

Вы можете редактировать BASEфайл, как вы хотите с или без использования команд объединения.
Вы также можете избавиться от слияния и просто отредактировать файл в своем любимом текстовом редакторе.

  • Код между <<<< HEADи =====маркерами - это код вашего локального файла до слияния.
  • Код между ====и >>>> <branch name>является кодом удаленного файла.
Фабьен Кватраво
источник
3
Некоторые люди лучше понимают конфликтующие фрагменты в файле, которые не смогли выполнить автоматическое объединение, если у них merge.conflictstyleустановлен параметр конфигурации diff3вместо значения по умолчанию merge.
kostix
3
Я на самом деле не вижу ГОЛОВУ, <<< и === поет. В случае, если вы предоставили среднее окно будет пустым. Но это всего лишь записка для других, спасибо за ваш ответ.
Цусанка
Если вы не видите HEAD, <<<<<и =====признаки, то это означает , что не существует никакого конфликта вообще. В этом случае среднее окно не будет пустым, оно покажет результат слияния, но не будет «красной» части
Фабьен Кватраво,
10
Когда я делаю слияние с Meld, я не вижу <<<<<<, ======ни >>>>>>маркеры в средней панели (т.е. версии базовой) либо; и иногда средняя панель будет пустой, как сообщает aGr. Возможно, это различие связано с разными настройками. Когда я начинаю инструмент сливаться, следующие файлы будут существовать, если предположить , что имя файла в хранилище является X.java: X.java, X.java.orig, X.java.BACKUP.#, X.java.BASE.#, X.java.LOCAL.#, X.java.REMOTE.#, где #некоторое число. Называя результат слияния, BASE-версия сбивает с толку; MERGED будет лучше.
Теему Лейсти
3
BASE на самом деле является общим предком, MERGED - это имя файла с информацией о частичном слиянии. Пожалуйста, смотрите мой вопрос и ответ Настройка и использование Meld в качестве вашего git difftool и mergetool, который объясняет, как именно это работает. НТН.
Mattst
107

У Meld есть скрытая функция трехстороннего слияния, активируемая передачей 4-го параметра:

meld $LOCAL $BASE $REMOTE $MERGED

Правая и левая панели открываются в режиме «только для чтения», поэтому вы не можете случайно слить их неправильно. Средняя панель показывает результат слияния. Для конфликтов он показывает базовую версию, чтобы вы могли видеть все важные биты: оригинальный текст посередине и конфликтующие модификации с обеих сторон. Наконец, когда вы нажимаете кнопку «Сохранить», файл $ MERGED записывается - в точности так, как ожидал git.

Файл ~ / .gitconfig, который я использую, содержит следующие настройки:

[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED

это открывает объединение с 3 вкладками, 1-я и 2-я вкладка, содержащая простые различия, которые я пытаюсь объединить, и 3-я вкладка, открытая по умолчанию, показывает трехстороннее представление слияния.

Теперь, причина, по которой функция скрыта, заключается в том, что она еще недостаточно отшлифована. Это очень полезно, как и сейчас, но Кай Вилладсен, автор слияния, указал на несколько морщин, которые нужно сгладить. Например, нет графического интерфейса для запуска режима трехстороннего слияния, синтаксис командной строки немного загадочный и тому подобное. Если вы говорите на питоне и у вас есть немного времени - вы знаете, что делать.

Изменить: В более новых версиях Мелд, Синакс немного изменился. Это было в комментариях, но это относится к ответу.

Команда meld теперь использует параметр --output, поэтому последняя строка из приведенного выше фрагмента должна быть:

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
Томек Бери
источник
7
@Jesse, @lumbric, похоже, что более новые версии meld используют флаг --outputдля результата $ MERGED. Я обнаружил это, глядя на скрипт запуска meld, который шел с моей версией git: github.com/git/git/blob/master/mergetools/meld
Иоганн,
1
@lumbric Я верю, что для Meld 1.7.x + с --output option. Смотрите эту строку в сценарии запуска:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Иоганн
12
В последней версии (версия> 1.8.4) мы должны использовать опцию --auto-merge. cmd = meld --diff $ BASE $ LOCAL --diff $ BASE $ REMOTE --auto-merge $ LOCAL $ BASE $ REMOTE
выход
7
У меня была та же проблема, что и у @pingpongboss при использовании Meld 1.8.4: Meld открывал вещи на отдельной панели вместо открытия третьей вкладки. Команда окончательно работал штраф: cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGED. Таким образом, это открывает 3 вкладки (старый добрый способ), автоматическое слияние неконфликтных слияний в середину, где середина - $ MERGED, и будет использоваться в качестве вывода разрешения конфликта.
Farmir
2
Синтаксис для вывода может быть --output=<file>или -o <file>, см.meld --help
levsa
57

Включено 4 файла:

  1. $LOCALФайл в ветке, где вы объединяете; не тронут процесс слияния при показе вам

  2. $REMOTEФайл на ветке, из которой вы сливаетесь; не тронут процесс слияния при показе вам

  3. $BASEОбщий предок $ LOCAL и $ REMOTE, т.е. точка, в которой две ветви начали отклонять рассматриваемый файл; не тронут процесс слияния при показе вам

  4. $MERGEDЧастично объединенный файл с конфликтами; это единственный файл, затронутый процессом слияния и, фактически, никогда не показанный вам вmeld


$MERGEDФайл является тот , который содержит <<<<<<, >>>>>>, =====(и, может быть, ||||||) маркер (которые отграничивают конфликты). Это файл, который вы редактируете вручную, чтобы исправить конфликты.

Ручное редактирование конфликтов и визуальное редактирование конфликтов выполняются для разных файлов и содержат различную информацию.

При использовании mergetool (предположим meld), файлы, которые видят в нем являются: $LOCAL, $BASE, $REMOTE. Обратите внимание, что вы не видите $MERGEDфайл, хотя он передается как скрытый параметр, meldчтобы записать в него результат редактирования.

Другими словами, meldвы редактируете файл посередине, $BASEфайл и выбираете все изменения слева или справа вручную . Это чистый файл, не затронутый процессом слияния. Единственный сбой в том, что при сохранении вы сохраняете не $BASEфайл, а четвертый скрытый параметр meld- $MERGEDфайл (который вы даже не видите). $BASEФайла не не содержит каких - либо конфликтов или частичное успешных слияний , потому что это не $MERGEDфайл .

При визуальном редактировании при представлении вам $BASEфайл (а не $MERGEDфайл) в gitосновном отбрасывает все его попытки выполнить слияние (эти попытки видны, если хотите, в файле $ MERGED) и позволяет вам полностью выполнить слияние с нуля .

Суть в том, что при конфликтах с ручным и визуальным слиянием вы не смотрите на одни и те же файлы, но конечный результат записывается в одном и том же файле (то есть $MERGEDфайле).

Ручная коррекция конфликтов делается на $MERGEDпотому , что git не имеет среднего представить вам три файла, поэтому он давит информацию из трех файлов ( $LOCAL, $BASE, $REMOTE) в этом $MERGEDфайле.

Но визуальные инструменты имеют средства , чтобы показать вам три файла: они показывают вам $LOCAL, $BASE, $REMOTEфайлы. Вы выбираете изменения от $LOCALи $REMOTEфайлов , и вы приносите те в $BASEфайл, полностью заново строить и даже перезапись неудачной попытки слияния , что является $MERGEDфайлом.

user1284631
источник
Я просто хотел, чтобы были инструменты (например, вне всякого сравнения), которые показывают все 4 файла
yoniLavi
@yoniYalovitsky: да, или p4merge
user1284631
Раньше я использовал инструмент слияния из пакета ClearCase
mishmashru
@yoniLavi - хорошо, эти инструменты показывают 4 панели , но не обязательно все четыре файла, как описано в этом ответе. В частности, вы можете настроить эти 4-панель инструментов , чтобы показать вам $LOCAL, $REMOTE, $BASEа выход первоначально составит $BASE, но отличаются от $MERGEDтем , что он не попытался GIT, чтобы объединить файлы и маркер конфликтов и так далее. Фактически, это был бы способ использовать эти инструменты, который наиболее похож на трехпанельный подход LOCAL / REMOTE / BASE + OUTPUT, который не показывает объединение. 4-я панель позволяет вам отделить базу от выходных данных.
BeeOnRope
16

Решение Cosmin работает, но файл $ BASE обновляется, а не $ MERGED . Это обновит файл $ MERGED :

Meld: v1.8.4

[merge]
  conflictstyle = diff3
  tool = mymeld
[mergetool "mymeld"]
  cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE
Саад Малик
источник
Я могу подтвердить это. Решение Саада работает на меня в Ubuntu. Что касается первоначального вопроса, то это правильный правильный ответ.
Космин
3
В моей версии meld - 3.11 эта команда прекрасно работает:cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
MartinM
зачем тебе --diff $BASE $LOCAL --diff $BASE $REMOTEв конце? для меня на 1.8.4 это нормально работает (насколько я вижу):cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
farmir
1
@farmir: это не обязательно. Он открывает еще две вкладки в поле, так что вы можете видеть LOCAL и REMOTE по сравнению с BASE по отдельности.
Сэм Кауфман
1
Независимо от того, в каком порядке я пытаюсь использовать эти аргументы, трехсторонняя вкладка всегда является третьей вкладкой, тогда как первая вкладка всегда выбирается по умолчанию. Есть ли способ сделать трехстороннюю вкладку выбранной по умолчанию?
Сэм Кауфман
13

С Meld 1.7 решение Томека Бери больше не работает.

Настройки по умолчанию меня не удовлетворяли:

Настройки по умолчанию

Вместо Meld> = 1,7 я предлагаю одно из двух других решений.

Первое решение :

 meld $LOCAL $BASE $REMOTE --auto-merge

первое решение

Второе решение :

 meld $LOCAL $MERGED $REMOTE

второе решение

.gitconfig

Скопируйте и вставьте это в свой .gitconfigфайл, чтобы получить решения, как описано выше:

[merge]
    tool = meld16
[mergetool "meld17"]
    # use this for Meld >=1.7
    # see http://stackoverflow.com/a/22911793/859591
    # second solution:
    cmd = meld $LOCAL $MERGED $REMOTE
    # first solution:
    #cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
    cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

[include]
    # requires git v1.7.10+
    path = .gitconfig.local

Скопируйте и вставьте это в .gitconfig.localфайл, чтобы установить meld17 или meld16 только для этой машины, если вы используете .gitconfig на нескольких машинах:

# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
    tool = meld17
lumbric
источник
Это не работает на Meld 1.8.4. Если вы запустите cmd = meld $LOCAL $BASE $REMOTE --auto-merge, средней панелью будет $ BASE, а не $ MERGE, который фактически используется в качестве результата разрешения конфликта.
Farmir
1
@farmir Вы выбрали $ BASE в качестве второй вкладки.
Alex78191
11

Я обнаружил, что ни один из файлов по умолчанию не был сохранен. MELD показывал $LOCAL, $REMOTEи $BASEпо умолчанию. Чтобы это сработало, мне нужно было сделать $MERGEDвместо этого шоу-шоу $BASE. Положив это в моем ~/.gitconfigисправил это для меня:

[merge]
        tool = mymeld
[mergetool "mymeld"]
        cmd = meld "$LOCAL" "$MERGED" "$REMOTE"

Я использую Arch, с:

$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1
Томас Леонард
источник
Извините, эта конфигурация совместима с inux?
MadMad666
2

По какой-то причине в последних версиях meld не отображаются строки маркеров, добавленные для конфликтов (<<<<<<<, =======, >>>>>>>). Если вы хотите увидеть эти строки, вам следует установить meld v 1.3.3 или более раннюю версию.

wnasich
источник
Я нашел полезным ответ @lumbric stackoverflow.com/a/22911793/641892
wnasich
2

Пожалуйста, смотрите ответ Саада для правильного ответа.

С Meld 1.8.1 на Ubuntu я получал

неверное количество аргументов, переданных в --diff

и добавив --output до того, как $ MERGED исправил это для меня:

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
Космин
источник