Какая версия файла git будет окончательно использована: локальная, базовая или удаленная?
когда есть Коллисон во время git merge, Я открываю mergetool под названием Meld. Он открывает три файла: локальный, базовый и удаленный. Как я читал местный я местный филиал, база общего предка и удаленного филиала должны быть объединены.
теперь мой вопрос: какая версия файла будет использоваться? Это удаленно? Если да, то могу ли я редактировать его так, как я хочу, независимо от того, что находится в базовой ветви, например?
8 ответов:
это тот, что посередине:
BASE.в самом деле
BASE- Это не общий предок, а наполовину законченное слияние, где конфликты отмечены>>>>и<<<<.вы можете увидеть имена файлов в верхней части окна редактирования meld.
вы можете редактировать
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 файла, участвующих:
$LOCALфайл на ветке, где вы сливаетесь;нетронутый процессом слияния, когда он показан вам
$REMOTEфайл на ветке, из которой вы сливаетесь;нетронутый процессом слияния, когда он показан вам
$BASEобщий предок $LOCAL и $Удаленный, т. е.. точка, в которой две ветви начали перенаправлять рассматриваемый файл;нетронутый процессом слияния, когда он показан вам
$MERGEDчастично объединенный файл, с конфликтами; это единственный файл, затронуты процессом слияния и, на самом деле, никогда не отображаетсяmeld
The - Это тот, который содержит
<<<<<<,>>>>>>,=====(и, может быть,||||||) маркеры (которые разделяют конфликты). этой - это файл, который вы редактируете вручную для устранения конфликтов.ручное редактирование конфликтов и редактирование визуальных конфликтов выполняются на разных файлах и представлены разные сведения.
при использовании mergetool (предположим
meld), файлы, которые видят в нем:$LOCAL,$BASE,$REMOTE. Обратите внимание, что вы не видите , хотя это передается как скрытый параметрmeldчтобы написать результат редактирования там.другими словами, в
meld, вы редактируете файл в середине,$BASEфайл, и вы выбираете все изменения слева или справа вручную. Это чистый файл, не затронутый процессом слияния. Единственный Глюк заключается в том, что, когда вы сохраняете, вы не сохраняете в$BASEфайл, но в четвертом скрытом параметреmeld, это (этого вы даже не видите). Элемент тут не содержат любые конфликты или частичные успешные слияния, потому что это не$MERGEDfile.в визуальном редактировании, при представлении вам (вместо
$MERGEDfile)gitв основном отбрасывает все свои попытки сделать слияние (эти попытки видны, если вы хотите, в файле $MERGED) и позволяет полностью выполнить слияние от царапины.суть в том, что в ручных и визуальных конфликтах слияния вы не смотрите на одни и те же файлы, но конечный результат записывается в один и тот же файл (то есть
$MERGEDfile).ручная коррекция конфликтов выполняется на
$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 настройки по умолчанию не удовлетворил меня:
вместо 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
я обнаружил, что ни один из файлов по умолчанию был спасен. сливаются показывает
$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