Является ли git слияние разрешения конфликтов более эффективным, чем другие SCM и инструменты слияния?
Является ли git
разрешением слияния конфликтов более эффективным, чем другие SCM (CVS, Subversion и т.д.), а также автономные инструменты слияния? Если да, то почему?
Уточнение: здесь меня больше интересует сам алгоритм - разве он не отличается от простого метода diff3?
Некоторые инструменты утверждают, что они умнее в этом (например, Guiffy), стоит ли подключать его к инструменту слияния git?
Является ли git умнее при анализе фрагментов текста, перемещаемых внутри или через файлы? (вместо того, чтобы сообщать о шумных конфликтах. У меня было смутное впечатление от разговоров Линуса).
Справочная информация: просто произошло огромное слияние с помощью git-svn
, в результате чего было половина конфликтов, чем я получил с простым svn merge
(сначала слияние без отслеживания). Поэтому я хотел бы понять, почему.
Подобные Qs/As вокруг, но они больше связаны с большой картиной процесса, и как слияние подходит более естественно. С этой целью git
"оптимизирован для слияний" (в отличие от только ветвления), действительно ли это означает:
- меньше ручных конфликтов - лучшие алгоритмы автоматического разрешения (например, переименование выполняется хорошо)
- более безопасная операция - автоматическое разрешение оставляет больше/только реальных конфликтов и меньше ложных предупреждений.
- более быстрая работа - скажем, из-за скудной и средней объектной модели.
- лучшее оснащение - что делает процесс менее болезненным, например. DAG-отслеживание слияния, mergetool, запрос/визуализация истории, stash, rebase и т.д.
- что-то еще
- сочетание вышеуказанного
? Теперь меня больше всего интересуют 1 и 2.
Я хотел бы, чтобы в этом ответе было неверно, но... исходя из этого... эта область git немного развита.
-
Автоматическое слияние в git не существует. Последняя версия имеет базовую поддержку для выполнения слияния, используя ваши изменения или их изменения, но это. В основном, если вы редактируете часть файла, а кто-то другой редактирует ту же часть файла... вы сами по себе для разрешения слияния. Формат diff3 доступен (с 3-сторонним слиянием), но я считаю, что унифицированный формат diff является стандартом. Я фактически использую araxis в качестве инструмента слияния и настрою его использовать 3-х мерное слияние при запуске "git mergetool". Исходя из perforce, хотя... Мне кажется, что git отстает в этой области.
-
N/A
Обновить RE: комментарии
Я не вырыл достаточно глубоко в точности, что git считает конфликтом, и именно то, что p4 считает конфликтом, но вот то, что я испытал в обоих.
- Git не игнорирует пробел при выполнении слияния... хотя об этом в будущем говорят о git. p4 может сделать это сейчас. Не игнорировать пустое пространство - большая боль, если все участники команды не согласятся использовать пробелы или вкладки, и если вы хотите изменить отступ файла (например, добавление xml node вокруг других узлов), тогда это получает старый быстро.
- Мне нравится, когда я сталкиваюсь с конфликтами слияния в файле... части, которые git говорят, конфликтуют, используя его унифицированный формат diff больше. Когда это только часть одной строки, которая изменила ее, будет отмечать большие порции как измененные, и вам нужно визуально отслеживать изменения между двумя областями унифицированного вывода diff. Вы можете обойти это, используя mergetool. p4 способен автоматически разрешать конфликты даже при редактировании одной и той же строки.
- Если вы объединяете ветвящиеся ветвящиеся ветки темы, то вы находитесь в поисках настоящего удовольствия. Без reerere включен (по умолчанию отключен) git забудет, что вы уже объединили тот файл, который был в конфликте неделю назад, и попросит вас снова объединить его. p4 делает это с легкостью
Мои ответы здесь немного субъективны... но я очень скучаю по слиянию, которое у меня было с perforce.
Кроме того, этот более свежий поток (2012) описывает понятие "автосохранение" с помощью Git:
Мое определение для "auto-resolve":
"Во время слияния файлы рабочих деревьев обновляются, чтобы отразить результат слияния... Когда обе стороны внесли изменения в разные области одного и того же файла, git выбирает обе стороны автоматически, и оставляет за собой право убедиться, что вы просмотрите эти результаты слияния для правильности после того, как git совершил слияние."IOW, "авторешение" специально означает, что обе стороны (наши и их) внесли изменения в
file(a)
, поскольку версия common-ancestorfile(a)
и git выбрала обе стороны без увеличения слияния- конфликт.
(Причина, по которой я пришел к термину "автосогласование", заключается в том, что в выводеgit-merge
термин "автоматическое слияние" также может указывать на то, что только одна сторона (их) изменилаfile(a)
, поскольку общий-предок и тот git является просто "быстрой переадресацией" ихfile(a)
поверх общего-предкаfile(a)
.)
Junio C Hamano поднимает ответ на важный момент:
- Знать git глупо и ошибочно на безопасной стороне, нанося удары любым удаленным сложностям;
- знают, что текстовые неконфликты, возникающие в одном файле, имеют одинаковый риск наличия семантического конфликта в разных файлах, поэтому выделение "затрагивает один и тот же файл, но не конфликтует", любое специальное значение бессмысленно, но в любом случае, вероятность возникновения такого конфликта достаточно мала, чтобы сначала слить слияние (и другие слияния), а затем проверить общий результат - это более эффективное использование вашего времени, потому что вы должны как-то разглядеть результат хотя бы один раз, прежде чем выталкивать его.
Другие вопросы по меткам git version-control merge conflict 3-way-merge или Задайте вопрос