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



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



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

663   8  

8 ответов:

это тот, что посередине:BASE.

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

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

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

meld base

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

  • код между <<<< HEAD и ===== маркеры-это один из ваших локальных файлов перед слиянием.
  • код между ==== и >>>> <branch name> является одним из удаленных файлов.

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

meld $LOCAL $BASE $REMOTE $MERGED

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

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

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

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

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

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

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

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

есть 4 файла, участвующих:

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

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

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

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


The - Это тот, который содержит <<<<<<,>>>>>>,===== (и, может быть,||||||) маркеры (которые разделяют конфликты). этой - это файл, который вы редактируете вручную для устранения конфликтов.

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

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

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

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

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

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

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

решение Космина работает, но $BASE файл обновляется--не $ MERGED. Это позволит обновить $ MERGED file:

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

С Meld 1.7 решение Tomek Bury больше не работает.

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

Default settings

вместо Meld > =1.7 Я предлагаю одно из двух других решений.

первый вариант:

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

first solution

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

 meld $LOCAL $MERGED $REMOTE

second solution

.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

я обнаружил, что ни один из файлов по умолчанию был спасен. сливаются показывает $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

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

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

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

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

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

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

Comments

    Ничего не найдено.