Как использовать 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, он перейдет к следующему конфликту, независимо от того, сколько изменений он показывает. Или в меню перейдите в «Найти» -> «Далее» -> «Конфликт».