2010-06-23 3 views
8

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

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

Фон: просто сделал огромное слияние, используя git-svn, что привело к половине конфликтов, чем я получил с простым svn merge (сначала слияние без отслеживания) .. так что я хотел бы понять, почему.


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

  1. меньше ручные конфликты - алгоритмы лучше автоматическое разрешение (., Например, переименование обрабатывается красиво)
  2. безопаснее работы - автоматическое разрешение оставляет больше/только реальные конфликты и меньше ложных срабатываний
  3. быстрее операцию - скажем, из-за обедненной & виду объектной модели
  4. лучше оснастки - что делает опыт менее болезненным, например, DAG-отслеживания слияния, mergetool, история запросов/визуализация, тайник, перебазироваться и т.д ...
  5. что-то другое
  6. комбинация выше

? Сейчас меня больше всего интересует 1 & 2.

+3

http://stackoverflow.com/questions/2475831/merging-hg-git-vs-svn или HTTP: // StackOverflow.com/questions/2518779/what-are-the-benefits-of-mercurial-or-git-over-svn-for-branching-merging может дать некоторые ответы (в основном по сравнению с SVN) и не забудьте http://stackoverflow.com/questions/612580/how-does-git-solve-the-merging-problem – VonC

+0

Спасибо, эти ссылки действительно полезны - и я не смог найти их сам. – inger

+0

@inger, так что вопрос закрыт как дубликат? –

ответ

1

Мне бы очень хотелось, чтобы этот ответ был неверным, но ... исходящий из этого ... эта область git немного развита.

  1. Автоматическое слияние в git не существует. Последняя версия имеет базовую поддержку для выполнения слияния с использованием ваших изменений или их изменений, но это все. В основном, если вы редактируете часть файла, а кто-то другой редактирует ту же часть файла ... вы сами по себе для разрешения слияния. Формат diff3 доступен (с 3-сторонним слиянием), но я считаю, что унифицированный формат diff является стандартом. Я фактически использую araxis в качестве инструмента слияния и настрою его использовать 3-х мерное слияние при запуске «git mergetool». Исходя из perforce, хотя ... Я чувствую, что git отстает в этой области.

  2. N/A

Update RE: комментарии

я не копал достаточно глубоко в то, что мерзавец считает конфликт и именно то, что p4 думает конфликт, но вот что я «Мы испытали оба.

  • Git не игнорирует пробел при слиянии ... хотя об этом говорится в будущем в git. p4 может сделать это сейчас. Не игнорировать пустое пространство - это большая боль, если все участники команды не согласятся использовать пробелы или вкладки, и если вы хотите изменить отступ файла (например, добавление узла xml вокруг других узлов), то это быстро стареет ,
  • Мне кажется, что когда я сталкиваюсь с конфликтами слияния в файле ... части, которые git говорят в конфликте, используя унифицированный формат diff, больше. Когда это только часть одной строки, которая была изменена, она будет отмечать большие части как измененные, и вам нужно визуально отслеживать изменения между двумя областями унифицированного вывода diff. Вы можете обойти это, используя mergetool. p4 способен автоматически разрешать конфликты даже при редактировании одной и той же строки.
  • Если вы объединяете ветви длинных тем, то вы находитесь в настоящее удовольствие. Без включения rerere (по умолчанию это отключено) git забудет, что вы уже объединили этот файл, который был в конфликте неделю назад, и попросит вас снова объединить его. p4 делает это с легкостью

Мои ответы здесь немного субъективны ... но я очень скучаю по слиянию, которое у меня было с perforce.

+0

Только для информации, что делает perforce теперь, если вы меняете ту же линию, что и кто-то другой, который изменился параллельно? В прошлый раз, когда я использовал p4, он был отмечен как конфликт и нуждался в ручном разрешении (аналогично git). –

+0

+1 Мне тоже интересно, что-то лучше было придумано, чем 3-х разное? Кажется, что в алгоритмах есть отклонения (см. Технический документ Guiffy), но если одна и та же строка изменена, вы столкнулись с ручным конфликтом. Если, конечно, не существует какого-либо инструмента для слияния с использованием языка и сильно зависит от языка. – inger

+0

ИМХО «автоматическое слияние несуществующих» немного сильное. Он есть - в обычном смысле: например. при использовании KDiff3 у него есть кнопка «Автоматическое слияние», и это делает больше или меньше того, что делает GIT, иногда лучше иногда хуже .. Но мне было интересно, не делает ли GIT свою дополнительную информацию о предыстории (например, порядок фиксации) для принятия правильных решений? (например, он знает, где вставлен код и т. д.) – inger

1

Кроме того, это more recent thread (2012) детализирует понятие «авто-разрешение» с Git:

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

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

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

  • знаю мерзавец глупо и заблуждается на безопасной стороне, нанося удары любым удаленным комплексом;
  • знают, что текстовые неконфликты, возникающие в одном файле, имеют одинаковый риск наличия семантического конфликта в разных файлах, поэтому выделение «коснулось одного и того же файла, но не противоречило», любое специальное значение бессмысленно, но в любом случае, вероятность возникновения такого конфликта достаточно мала, чтобы сначала слить слияние (и другие слияния), а затем проверить общий результат - это более эффективное использование вашего времени, потому что вы должны как-то разглядеть результат хотя бы один раз, прежде чем выталкивать его.
+0

Спасибо. вы намекаете, что ответ на мой вопрос «нет»? – inger

+0

@inger: действительно: «нет по дизайну» – VonC

 Смежные вопросы

  • Нет связанных вопросов^_^