Когда вы будете использовать различные стратегии слияния git?
на странице man на git-merge есть несколько стратегий слияния, которые вы можете использовать.
разрешить -
Это может разрешить только две головки (т. е. текущую ветвь и другую ветвь, из которой вы вытащили), используя алгоритм слияния 3-way. Он пытается тщательно обнаруживать перекрестные неоднозначности слияния и считается в целом безопасным и быстрым.рекурсивные -
Это может разрешить только две головки с помощью 3-стороннего слияния алгоритм. Если существует несколько общих предков, которые могут использоваться для 3-стороннего слияния, он создает объединенное дерево общих предков и использует его в качестве справочного дерева для 3-стороннего слияния. Сообщалось, что это приводит к меньшему количеству конфликтов слияния, не вызывая неправильных слияний с помощью тестов, выполненных на фактических коммитах слияния, взятых из истории разработки ядра Linux 2.6. Кроме того, это может обнаруживать и обрабатывать слияния с участием переименований. Это стратегия слияния по умолчанию при вытягивании или слиянии одного отделение.осьминог -
Это решает более чем двухголовочный случай, но отказывается выполнять сложное слияние, которое требует ручного разрешения. Он в первую очередь предназначен для объединения глав ветвей тем вместе. Это стратегия слияния по умолчанию при вытягивании или слиянии нескольких ветвей.наша -
Это решает любое количество головок, но результатом слияния всегда является текущая головка ветви. Так и должно быть. используется для замены старой истории развития боковых ветвей.поддерева -
Это модифицированная рекурсивная стратегия. При объединении деревьев A и B, если B соответствует поддереву A, B сначала настраивается в соответствии с древовидной структурой A, а не считывает деревья на том же уровне. Эта настройка также выполняется для общего дерева предков.
когда я должен указать что-то другое, чем по умолчанию? Какие бывают сценарии для каждого лучше?
3 ответов:
Я не знаком с resolve, но я использовал другие:
рекурсивные
рекурсивный-это значение по умолчанию для слияний без быстрой перемотки вперед. Мы все с ним знакомы.
осьминог
я использовал осьминога, когда у меня было несколько деревьев, которые необходимо объединить. Вы видите это в более крупных проектах, где многие отрасли имеют самостоятельное развитие, и все это готово объединиться в одну голову.
ветка осьминога сливается несколько голов в одном фиксации до тех пор, как он может сделать это чисто.
серия рекурсивных слияний будет выглядеть так (Обратите внимание, что первое слияние было быстрым, так как я не заставлял рекурсию):
тем не менее, слияние одного осьминога будет выглядеть так это:
commit ae632e99ba0ccd0e9e06d09e8647659220d043b9 Merge: f51262e... c9ce629... aa0f25d...наша
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