Является ли git слияние разрешения конфликтов более эффективным, чем другие SCM и инструменты слияния?

Является ли git разрешением слияния конфликтов более эффективным, чем другие SCM (CVS, Subversion и т.д.), а также автономные инструменты слияния? Если да, то почему?

Уточнение: здесь меня больше интересует сам алгоритм - разве он не отличается от простого метода diff3?
Некоторые инструменты утверждают, что они умнее в этом (например, Guiffy), стоит ли подключать его к инструменту слияния git? Является ли git умнее при анализе фрагментов текста, перемещаемых внутри или через файлы? (вместо того, чтобы сообщать о шумных конфликтах. У меня было смутное впечатление от разговоров Линуса).

Справочная информация: просто произошло огромное слияние с помощью git-svn, в результате чего было половина конфликтов, чем я получил с простым svn merge (сначала слияние без отслеживания). Поэтому я хотел бы понять, почему.


Подобные Qs/As вокруг, но они больше связаны с большой картиной процесса, и как слияние подходит более естественно. С этой целью git "оптимизирован для слияний" (в отличие от только ветвления), действительно ли это означает:

  • меньше ручных конфликтов - лучшие алгоритмы автоматического разрешения (например, переименование выполняется хорошо)
  • более безопасная операция - автоматическое разрешение оставляет больше/только реальных конфликтов и меньше ложных предупреждений.
  • более быстрая работа - скажем, из-за скудной и средней объектной модели.
  • лучшее оснащение - что делает процесс менее болезненным, например. DAG-отслеживание слияния, mergetool, запрос/визуализация истории, stash, rebase и т.д.
  • что-то еще
  • сочетание вышеуказанного

? Теперь меня больше всего интересуют 1 и 2.

8
задан 24 июня '10 в 1:26
источник поделиться
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.

1
ответ дан 20 июля '10 в 1:17
источник

Кроме того, этот более свежий поток (2012) описывает понятие "автосохранение" с помощью Git:

Мое определение для "auto-resolve":
"Во время слияния файлы рабочих деревьев обновляются, чтобы отразить результат слияния... Когда обе стороны внесли изменения в разные области одного и того же файла, git выбирает обе стороны автоматически, и оставляет за собой право убедиться, что вы просмотрите эти результаты слияния для правильности после того, как git совершил слияние."

IOW, "авторешение" специально означает, что обе стороны (наши и их) внесли изменения в file(a), поскольку версия common-ancestor file(a) и git выбрала обе стороны без увеличения слияния- конфликт.
(Причина, по которой я пришел к термину "автосогласование", заключается в том, что в выводе git-merge термин "автоматическое слияние" также может указывать на то, что только одна сторона (их) изменила file(a), поскольку общий-предок и тот git является просто "быстрой переадресацией" их file(a) поверх общего-предка file(a).)

Junio ​​C Hamano поднимает ответ на важный момент:

  • Знать git глупо и ошибочно на безопасной стороне, нанося удары любым удаленным сложностям;
  • знают, что текстовые неконфликты, возникающие в одном файле, имеют одинаковый риск наличия семантического конфликта в разных файлах, поэтому выделение "затрагивает один и тот же файл, но не конфликтует", любое специальное значение бессмысленно, но в любом случае, вероятность возникновения такого конфликта достаточно мала, чтобы сначала слить слияние (и другие слияния), а затем проверить общий результат - это более эффективное использование вашего времени, потому что вы должны как-то разглядеть результат хотя бы один раз, прежде чем выталкивать его.
1
ответ дан 02 окт. '12 в 10:21
источник

Другие вопросы по меткам или Задайте вопрос