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

Когда я использую meld в качестве git mergetool для решения конфликтов во время слияния, meld показывает мне различия между локальными / выходными и удаленными / выходными файлами (синим или зеленым), которые git автоматически решает, а не только фактические конфликты (которые выделены красным), И когда я нажимаю стрелку вниз, происходит переход к следующему (сине-зеленому) различию, а не к следующему конфликту (красному). В этой теме картина иллюстрирует это.

Как можно: - игнорировать разницу, которая не конфликтует - или попала в следующий конфликт (как в kdiff3), не останавливаясь на различиях??

4 ответа

Добавьте следующее в свой .gitconfig:

[mergetool "meld"]
  cmd = meld --auto-merge "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"

Это та же команда, которую Git запускает по умолчанию с --auto-merge указан так, чтобы Meld автоматически разрешал то, что он может.

В дополнение к параметрам, специфичным для meld, теперь у вас есть новые параметры Git:

С Git 2.31 (первый квартал 2021 г.) " <tcode id="1347222"></tcode>" (man) загружает три версии (базовую, локальную и удаленную) конфликтующего пути без изменений.
Команда научилась дополнительно готовить эти файлы с уже разрешенными конфликтующими частями .

См. Commit 9d9cf23 , commit de8dafb, commit 98ea309 (09 февраля 2021 г.) Seth House ( <tcode id="1347223"></tcode>) .
(Слияние Junio ​​C Hamano - <tcode id="1347224"></tcode>- в коммите 78a26cb, 17 февраля 2021 г.)

: добавить конфигурацию

Автор оригинала: Фелипе Контрерас
Подписано: Сет Хаус

Назначение mergetool - помочь пользователю разрешить любые конфликты, которые Git не может разрешить автоматически.
Если есть конфликт, который необходимо разрешить вручную, Git напишет файл с именем MERGED, который содержит все, что Git смог разрешить самостоятельно, а также все, что он не смог разрешить, завернутый в маркеры конфликта.

Один из способов представить себе это как двух- или трехстороннее различие.
Если каждая «сторона» маркеров конфликта извлекается отдельно, внешний инструмент может представить эти конфликты как параллельные различия.

Однако многие mergetools вместо diff, и оба содержат версии файла до слияния.
Поскольку конфликты, которые Git разрешает автоматически, отсутствуют, он вынуждает пользователя повторно разрешать эти конфликты вручную.
Некоторые mergetools также показывают MERGED но часто только для справки, а не в качестве координационного центра для разрешения конфликтов.

Это добавляет флаг, который перезапишет LOCAL и REMOTEс каждой соответствующей «стороной» конфликтующего файла и, таким образом, скрыть все конфликты, которые Git смог разрешить сам.
Перезапись этих файлов немедленно принесет пользу любому mergetool, который их использует, не требуя каких-либо изменений в инструменте.

В небольшом обзоре популярных mergetools не было отмечено никаких побочных эффектов, поэтому по умолчанию используется такое поведение.
Однако его можно отключить глобально, установив значение.

См. " Mergetools: Прекратите выполнять трехстороннее слияние! "

теперь включает в свою справочную страницу :

Во время слияния Git автоматически разрешит как можно больше конфликтов и запишет файл MERGED, содержащий маркеры конфликтов, вокруг любых конфликтов, которые он не может разрешить; «LOCAL» и «REMOTE» обычно представляют версии файла до разрешения конфликтов Git.

Этот флаг вызывает перезапись LOCAL и REMOTE, так что инструменту слияния будут представлены только неразрешенные конфликты.

Может быть настроен для каждого инструмента с помощью переменной конфигурации. По умолчанию true.

В случае OP:

      git config --global mergetool.meld.hideResolved true

Это описано в:

<tcode id="1347225"></tcode>: добавить поддержку для каждого инструмента и переопределить флаг hideResolved

Помогал: Йоханнес Сикст.
Помогал: Юнио С. Хамано.
Подпись: Сет Хаус.

Добавьте флаг переопределения для каждого инструмента, чтобы пользователи могли включить флаг для одного инструмента и отключить его для другого, установив значение false.

Кроме того, автор или сопровождающий mergetool может дополнительно изменить значение по умолчанию для этого mergetool.
Если mergetools/<tool> сценарий оболочки содержит hide_resolved_enabled функция будет вызываться при вызове mergetool, а возвращаемое значение будет использоваться по умолчанию для hideResolved флаг.

       hide_resolved_enabled () {
    return 1
}

Отключение может быть желательно, если mergetool хочет или нуждается в доступе к исходным немодифицированным версиям "LOCAL" и "REMOTE" конфликтующего файла.

Например:

  • Инструмент может использовать собственный алгоритм разрешения конфликтов и предпочитать игнорировать результаты разрешения конфликтов Git.
  • Инструмент может захотеть визуально сравнить / ограничить версию файла до слияния (сохраненную в «LOCAL», «REMOTE» и «BASE») с результатами разрешения конфликтов Git (сохраненными в «MERGED»).

git configтеперь включает в свою справочную страницу :

mergetool.<tool>.hideResolved

Позволяет пользователю переопределить глобальный mergetool.hideResolved значение для конкретного инструмента.

В meld, вы можете нажать Changes > Merge All, что объединит большинство изменений, за исключением конфликтов.

Если вы используете cmd+D на своем Mac, он перейдет к следующему конфликту, независимо от того, сколько изменений он показывает. Или в меню перейдите в «Найти» -> «Далее» -> «Конфликт».

Другие вопросы по тегам