Полулинейное слияние

Я только что заметил в Azure DevOps этот 9X_vso параметр под названием semi-linear merge. Мне было интересно, что 9X_visual-studio-online он делает? Между стратегией слияния и стратегией 9X_vsts перебазирования (от названия полулинейной)? Если 9X_vso да, то каковы плюсы / минусы?

9X_Полулинейное слияние_team-foundation-service

Изменить: Из 9X_git-commands Microsoft Devblog я считаю, что этот вариант состоит из двух 9X_vso пунктов:

  1. Восстановите ветку функций из ветки master / dev.
  2. Затем объедините функциональную ветку с веткой master / dev.

Но разве это не стратегия слияния?

25
0
2
Общее количество ответов: 2

Ответ #1

Ответ на вопрос: Полулинейное слияние

Полулинейное слияние
Эта стратегия наиболее экзотична - это 9X_vso сочетание перебазирования и слияния. Во-первых, коммиты 9X_git в запросе на перенос перемещаются поверх 9X_azure-devops основной ветки. Затем эти перенастроенные 9X_vsts запросы на перенос объединяются в главную 9X_visual-studio-team-services ветку. Он имитирует выполнение git rebase master в ветви 9X_vsts запроса на вытягивание, за которым следует 9X_git git merge pr --no-ff в главной ветви.

9X_Полулинейное слияние_vsts

Некоторые люди считают 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

35
0

Ответ #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 некоторые плюсы и минусы:

Плюсы:

  1. Сначала перебазирование упрощает визуальное отслеживание каждого слияния. Он также помещает все изменения в сами коммиты, вместо того, чтобы отслеживать нежелательные побочные эффекты в коммитах слияния, что обычно сложно. Обратите внимание, что разработчикам по-прежнему рекомендуется выполнять перебазирование перед созданием своего PR, чтобы они могли наблюдать любые изменения, которые происходят в это время, а также запускать свои модульные тесты для последней версии, чтобы убедиться, что ничего страшного не произошло. (Это похоже на тестирование фиксации слияния и выполнение тестов перед созданием PR, чтобы убедиться, что обычное слияние по-прежнему работает должным образом.)
  2. Слияние (с --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".

26
1

  • @WaldoBronchart Какие действия выполняет скрипт? (Кстати, я бы предпочел термин «п ...