Когда вы будете использовать различные стратегии слияния git?



на странице man на git-merge есть несколько стратегий слияния, которые вы можете использовать.




  • разрешить -
    Это может разрешить только две головки (т. е. текущую ветвь и другую ветвь, из которой вы вытащили), используя алгоритм слияния 3-way. Он пытается тщательно обнаруживать перекрестные неоднозначности слияния и считается в целом безопасным и быстрым.


  • рекурсивные -
    Это может разрешить только две головки с помощью 3-стороннего слияния алгоритм. Если существует несколько общих предков, которые могут использоваться для 3-стороннего слияния, он создает объединенное дерево общих предков и использует его в качестве справочного дерева для 3-стороннего слияния. Сообщалось, что это приводит к меньшему количеству конфликтов слияния, не вызывая неправильных слияний с помощью тестов, выполненных на фактических коммитах слияния, взятых из истории разработки ядра Linux 2.6. Кроме того, это может обнаруживать и обрабатывать слияния с участием переименований. Это стратегия слияния по умолчанию при вытягивании или слиянии одного отделение.


  • осьминог -
    Это решает более чем двухголовочный случай, но отказывается выполнять сложное слияние, которое требует ручного разрешения. Он в первую очередь предназначен для объединения глав ветвей тем вместе. Это стратегия слияния по умолчанию при вытягивании или слиянии нескольких ветвей.


  • наша -
    Это решает любое количество головок, но результатом слияния всегда является текущая головка ветви. Так и должно быть. используется для замены старой истории развития боковых ветвей.


  • поддерева -
    Это модифицированная рекурсивная стратегия. При объединении деревьев A и B, если B соответствует поддереву A, B сначала настраивается в соответствии с древовидной структурой A, а не считывает деревья на том же уровне. Эта настройка также выполняется для общего дерева предков.



когда я должен указать что-то другое, чем по умолчанию? Какие бывают сценарии для каждого лучше?

912   3  

3 ответов:

Я не знаком с resolve, но я использовал другие:

рекурсивные

рекурсивный-это значение по умолчанию для слияний без быстрой перемотки вперед. Мы все с ним знакомы.

осьминог

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

ветка осьминога сливается несколько голов в одном фиксации до тех пор, как он может сделать это чисто.

серия рекурсивных слияний будет выглядеть так (Обратите внимание, что первое слияние было быстрым, так как я не заставлял рекурсию):

series of recursive merges

тем не менее, слияние одного осьминога будет выглядеть так это:

commit ae632e99ba0ccd0e9e06d09e8647659220d043b9
Merge: f51262e... c9ce629... aa0f25d...

octopus merge

наша

Ours == я хочу вытащить другую голову, но отбросить все изменения, которые вводит голова.

это сохраняет историю ветви без каких-либо последствий ветви.

(читайте: он даже не смотрел на изменения между этими ветвями. Ветви просто объединяются, и ничего не делается для файлов. Если вы хотите слиться в другой ветке и каждый раз есть вопрос "наша версия файла или их версия" вы можете использовать git merge -X ours)

поддерева

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

на самом деле только две стратегии вы хотели бы выбрать наша Если вы хотите отказаться от изменений, внесенных веткой, но сохранить ветку в истории, и поддерева Если вы объединяете независимый проект в подкаталог суперпроекта (например, "Git-gui" в репозитории "git").

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

"разрешить" против "рекурсивной" стратегии слияния

рекурсивная-это текущая стратегия по умолчанию с двумя головками, но после некоторого поиска я наконец нашел некоторую информацию о стратегии слияния "resolve".

взято из книги О'Рейли контроль версий с Git (Амазонка) (перефразировано):

первоначально" resolve " была стратегией по умолчанию для слияний Git.

в перекрестных ситуациях слияния, где есть больше чем одна возможная основа слияния, стратегия разрешения работает следующим образом: выберите одну из возможных баз слияния и надейтесь на лучшее. Это на самом деле не так плохо, как кажется. Часто оказывается, что пользователи работали над разными частями кода. В этом случае Git обнаруживает, что он повторяет некоторые изменения, которые уже существуют, и пропускает повторяющиеся изменения, избегая конфликта. Или, если это небольшие изменения, которые вызывают конфликт, по крайней мере, конфликт должен быть легким для проявитель для обработки..

я успешно объединил деревья, используя "resolve", который не удалось с рекурсивной стратегией по умолчанию. Я получал fatal: git write-tree failed to write a tree ошибки, и спасибо этот блог (зеркала) я попробовал "- s resolve", который работал. Я до сих пор точно не знаю, почему... но я думаю, что это было потому, что у меня были повторяющиеся изменения в обоих деревьях, и решение "пропустило" их должным образом.

Comments

    Ничего не найдено.