Полулинейное слияние
Я только что заметил в Azure DevOps этот 9X_vso параметр под названием semi-linear merge
. Мне было интересно, что 9X_visual-studio-online он делает? Между стратегией слияния и стратегией 9X_vsts перебазирования (от названия полулинейной)? Если 9X_vso да, то каковы плюсы / минусы?
Изменить: Из 9X_git-commands Microsoft Devblog я считаю, что этот вариант состоит из двух 9X_vso пунктов:
- Восстановите ветку функций из ветки master / dev.
- Затем объедините функциональную ветку с веткой master / dev.
Но разве это не стратегия слияния?
Ответ #1
Ответ на вопрос: Полулинейное слияние
Полулинейное слияние
Эта стратегия наиболее экзотична - это 9X_vso сочетание перебазирования и слияния. Во-первых, коммиты 9X_git в запросе на перенос перемещаются поверх 9X_azure-devops основной ветки. Затем эти перенастроенные 9X_vsts запросы на перенос объединяются в главную 9X_visual-studio-team-services ветку. Он имитирует выполнениеgit rebase master
в ветви 9X_vsts запроса на вытягивание, за которым следует 9X_gitgit merge pr --no-ff
в главной ветви.Некоторые люди считают 9X_tfs-service это лучшим из обоих миров: отдельные коммиты 9X_git-commands сохраняются, чтобы вы могли видеть, как 9X_git развивалась работа, но вместо того, чтобы 9X_vso просто перебазировать, отображается «пузырь 9X_vs-team-services слияния», чтобы вы могли сразу увидеть работа 9X_visual-studio-online в каждом отдельном запросе на вытягивание.
Взято 9X_team-foundation-service из Pull Requests with Rebase
Ответ #2
Ответ на вопрос: Полулинейное слияние
Полулинейное слияние просто добавляет перебазирование, чтобы 9X_visual-studio-team-services обновить вашу ветку до завершения слияния. Если 9X_visual-studio-online вы PR'ing my-branch
в target-branch
, это идентично следующим командам:
git fetch git checkout my-branch git rebase origin/target-branch git branch -D target-branch # just in case you have an old version of it locally git checkout target-branch git merge --no-ff my-branch
Вот 9X_visual-studio-online некоторые плюсы и минусы:
Плюсы:
- Сначала перебазирование упрощает визуальное отслеживание каждого слияния. Он также помещает все изменения в сами коммиты, вместо того, чтобы отслеживать нежелательные побочные эффекты в коммитах слияния, что обычно сложно. Обратите внимание, что разработчикам по-прежнему рекомендуется выполнять перебазирование перед созданием своего PR, чтобы они могли наблюдать любые изменения, которые происходят в это время, а также запускать свои модульные тесты для последней версии, чтобы убедиться, что ничего страшного не произошло. (Это похоже на тестирование фиксации слияния и выполнение тестов перед созданием PR, чтобы убедиться, что обычное слияние по-прежнему работает должным образом.)
- Слияние (с --no-ff) вызывает фиксацию слияния, и это полезно, потому что каждый PR содержит список коммитов, связанных только с этим PR, что позволяет вам просматривать историю первого родителя, которая показывает все слияния в ветку, и легко их сравнить. Еще одно преимущество принудительной фиксации слияния состоит в том, что можно легко отменить весь PR, просто отменив фиксацию слияния, а не индивидуально откатить каждую фиксацию, которая была в исходном PR.
Минусы:
- Есть несколько сценариев, в которых вы просто не хотите использовать полулинейное слияние. Хороший пример - если в исходной ветке есть новые коммиты слияния, которые вы хотите сохранить. В Git Flow, когда вы объединяете release в master или master обратно в develop, вам необходимо сохранить любой из слияние совершается из PR в этих ветвях. Часть перебазирования полулинейного слияния перезапишет эти коммиты слияния, и не только появятся «пузыри», но, что еще хуже, будут переписаны идентификаторы фиксации. Это означает, что вы не будете знать наверняка, все ли в master в настоящее время develop. Идентификаторы могут отсутствовать, несмотря на то, что код идентичен. Как правило, просто не выполняйте полулинейное слияние, если исходная ветвь содержит новые коммиты слияния.
- После полулинейного слияния при удалении локальных веток вам, возможно, придется использовать
git branch -D my-branch
(вместо -d в нижнем регистре), поскольку идентификаторы фиксации могли измениться. Это едва ли неудобство, если вы обычно не удаляете локальные ветки сразу; если вы подождете, вам нужно будет подтвердить, что вы действительно можете удалить его. - Если ваш рабочий процесс заключается в том, что разработчики должны переназначить целевую ветку перед созданием своего PR, наличие этой опции может сделать их ленивыми, поскольку они знают, что это сделает это за них. В большинстве случаев это не проблема, но время от времени автоматическое слияние или ребазирование что-то ломает, и лучше сначала привыкнуть к ребазированию, чтобы обнаружить это до завершения PR. В противном случае в этом (правда, редком) сценарии конфликт разрешается автоматически и что-то ломается в вашей ветви интеграции.
- Если вы используете подписанные коммиты, если во время полулинейного слияния потребуется перебазирование, подписи не будут сохранены (поскольку коммиты переписываются). В зависимости от почему вы подписываете свои коммиты, это может быть неприемлемым выбором.
Примечание: другие инструменты 9X_visual-studio-online также предоставляют эту функцию:
- Bitbucket offers the identical merge strategy и называет это, соответственно, "Rebase, merge".
- GitLab has a setting для принудительного выполнения «фиксации слияния с полулинейной историей», однако на момент написания этой статьи, AFAIK, это всего лишь ворота в MR. (Обратите внимание, что GitLab называет Pull Requests «Merge Requests». Это одно и то же.) Если этот параметр включен, вы должны сначала переустановить его самостоятельно (что вы можете сделать в пользовательском интерфейсе), а затем завершите MR. Обычно это 2 нажатия кнопки вместо 1.
- GitHub пока не поддерживает это, хотя люди запрашивают его с 2017 года.
Дополнительное примечание: я нигде 9X_azure-devops не могу найти это задокументированное, но 9X_azure-devops я проверил и подтвердил, что при заполнении 9X_vso PR в Azure DevOps, если вы выберете либо 9X_team-foundation-service «Rebase and fast-forward», либо «Полулинейное 9X_vsts слияние», ваша ветка PR-источника переписывается 9X_git-commands до того, как PR будет завершен. Обычно вы 9X_vso ставите галочку в поле, чтобы удалить исходную 9X_vsts ветку после слияния, и не заботитесь об 9X_azure-devops этом, но если вы решите не отмечать этот 9X_git параметр, важно понимать, что ваша удаленная 9X_git ветка будет отображаться как «(принудительное 9X_vso обновление)» в ваша следующая локальная 9X_git-commands выборка, если требуется перебазирование. Это 9X_git-commands может быть Pro или Con в зависимости от 9X_vsts вашего варианта использования; Я бы предпочел 9X_git-commands это в большинстве случаев.
Что касается других 9X_team-foundation-service инструментов, с этой стратегией GitLab заставляет 9X_visual-studio-team-services вас обновлять ветку нажатием кнопки, а Bitbucket 9X_vsts специально не изменяет ветвь PR в ее эквиваленте 9X_team-foundation-service " Стратегия "Rebase, merge".
- @WaldoBronchart Какие действия выполняет скрипт? (Кстати, я бы предпочел термин «п ...
-
14
-
3
-
3
-
3
-
2
-
4
-
2
-
17
-
3
-
1
-
4
-
2
-
1
-
23
-
2
-
3
-
1
-
4
-
1
-
2
-
1
-
3
-
8
-
3
-
3
-
1
-
5
-
2
-
3
-
4
-
9
-
1
-
6
-
7
-
2
-
1
-
4
-
2
-
1
-
1
-
3
-
2
-
1
-
2
-
3
-
7
-
5
-
1
-
2
-
9