Bitbucket decline pull request что это

Bitbucket Support

Knowledge base

Products

Jira Software

Project and issue tracking

Jira Service Management

Service management and customer support

Jira Core

Manage any business project

Confluence

Bitbucket

Git code management

Resources

Documentation

Usage and admin help

Community

Answers, support, and inspiration

Suggestions and bugs

Feature suggestions and bug reports

Marketplace

Billing and licensing

Frequently asked questions

Viewport

Confluence

Versions

Pull requests

Use Bitbucket Data Center and Server

On this page

In this section

Related content

Still need help?

The Atlassian Community is here for you.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Pull requests in Bitbucket Data Center and Server provide a quick and easy way for software teams to collaborate on code. A pull request is a dedicated forum for discussing a proposed feature. If there are problems with the changes, teammates can post feedback in the pull request and even tweak the feature by pushing follow-up commits. All of this activity is tracked directly inside of the pull request.

A pull request requires differences between two distinct branches. When you create a pull request you’ll specify the branch to merge changes into.

Create a branch

Create a pull request

In their simplest form, pull requests allow a developer to notify team members that they’ve completed a feature. Once their feature branch is ready, the developer files a pull request via their Bitbucket account. This lets everybody involved know that they need to review the code and merge it into the master branch.

Review and discuss a pull request

As a reviewer of a pull request, your colleagues are counting on you to review changes to the code then provide feedback. Use reviewer status indicators to let a pull request author know you approve the changes or that changes need more work before you can approve.

Approving a pull request lets the author know you reviewed their changes and that you feel the work can be merged with the target branch.

Indicating a pull request needs work should accompany a comment to the author letting them know what should change before merging the pull request. Once the author pushes more changes to the pull request, revisit the pull request to review the new iteration. Bitbucket remembers what you’ve already reviewed and only shows you the changes made since your last visit. At any time you can choose to view the entire effective diff or individual commits and make comments there also.

Merge a pull request

Once you are ready to merge a pull request, and when the reviewers have approved it, click Merge at the top right of the pull request view. You can merge a pull request if you have write (or admin) permission on the project.

Источник

Знакомство с интерфейсом Bitbucket

Прежде чем начать, создайте аккаунт Bitbucket Cloud, чтобы самостоятельно ознакомиться с особенностями этого сервиса. В этом руководстве кратко рассказывается о компонентах Bitbucket, которыми вы будете часто пользоваться, поэтому не закрывайте эту вкладку, пока регистрируетесь. Возвращайтесь, как только закончите.

Хотите начать работу с Bitbucket Server? Перейдите по ссылке.

Давайте теперь познакомимся с пользовательским интерфейсом Bitbucket и поговорим о том, что нужно, чтобы начать работу.

Ваша работа

На дашбоарде Your work (Ваша работа) отображаются запросы pull и репозитории, имеющие к вам отношение.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Репозитории

В окне Repositories (Репозитории) отображается список всех репозиториев, к которым вам предоставлен доступ.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Проекты

С помощью проектов можно группировать и структурировать репозитории. Так их будет проще найти. В окне Projects (Проекты) можно просмотреть существующие проекты и создать новые. Если нажать по проекту, откроется список со всеми репозиториями в нем.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Запросы pull

Проверка кода является важным этапом в жизненном цикле разработки программного обеспечения. Благодаря ей вы будете уверенно поставлять качественный код. В Bitbucket проверка кода осуществляется через запросы pull. В окне Pull requests (Запросы pull) вы можете быстро найти все, что требует внимания.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Выбрать, какие запросы pull будут отображаться в списке, можно с помощью кнопок быстрой фильтрации:

Неполадки

Когда вы добавляете репозиторий в Bitbucket Cloud, вы также получаете средство отслеживания задач. Оно позволяет отслеживать запросы на новые функции, сообщения об ошибках и прочие задачи вашего проекта.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Ваши настройки Bitbucket

В разделе настроек Bitbucket находятся важные настройки, с помощью которых вы можете управлять своим аккаунтом, например:

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Чтобы открыть настройки Bitbucket, нажмите на своем аватаре в левом нижнем углу и выберите Bitbucket settings (Настройки Bitbucket)

Источник

Выполнение запроса pull

Пул-реквесты облегчают совместную работу разработчиков в Bitbucket. Они обеспечивают удобный веб-интерфейс для обсуждения предлагаемых изменений до их включения в официальный репозиторий проекта.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

В упрощенном виде запросы pull — это механизм, с помощью которого разработчик уведомляет участников команды о том, что он подготовил некий функционал. Закончив работу над функциональной веткой, разработчик создает запрос pull с помощью аккаунта Bitbucket. Так все участники процесса узнают, что требуется проверить код и выполнить слияние с главной веткой ( main ).

Однако запрос pull — это не просто уведомление, а специальный форум для обсуждения предлагаемой функции. Если с изменениями возникли какие-либо проблемы, участники команды могут публиковать в запросе pull отзывы и даже изменять функцию с помощью дополнительных коммитов. Все эти действия отслеживается непосредственно внутри запроса pull.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

По сравнению с другими моделями совместной работы это формальное решение для обмена коммитами обеспечивает гораздо более упорядоченный рабочий процесс. SVN и Git могут автоматически отправлять уведомления по электронной почте с помощью простого скрипта; однако когда дело доходит до обсуждения изменений, разработчикам обычно приходится вести диалог по электронной почте. Такой подход может внести путаницу, особенно если начинается обмен дополняющими коммитами. Запросы pull помещают все эти функции в удобный веб-интерфейс рядом с репозиториями Bitbucket.

Структура запроса pull

Создавая пул-реквест, вы всего лишь просите другого разработчика (например, человека, занимающегося поддержкой проекта) забрать ветку из вашего репозитория в его репозиторий. Поэтому для создания пул-реквеста необходимо указать 4 параметра: исходный репозиторий, исходную ветку, репозиторий назначения и ветку назначения.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Для многих параметров сервис Bitbucket определяет нужные значения по умолчанию. Однако в зависимости от того, как налажен процесс совместной работы команды, может потребоваться указать другие значения. На приведенной выше схеме показан запрос pull о слиянии функциональной ветки с официальной главной веткой, однако существует множество других способов использования запросов pull.

Порядок действий

Пул-реквесты можно применять в сочетании с процессами Feature Branch Workflow, Gitflow Workflow или Forking Workflow. При этом для использования пул-реквестов требуются две отдельные ветки или два отдельных репозитория. Поэтому пул-реквесты не будут работать при использовании процесса Centralized Workflow. Использование пул-реквестов в каждом из перечисленных процессов имеет свои нюансы, но общий подход описан ниже.

Разработчик создает функцию в отдельной ветке в своем локальном репозитории.

Разработчик отправляет эту ветку в публичный репозиторий Bitbucket командой push.

Разработчик создает запрос pull через Bitbucket.

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

Человек, занимающийся поддержкой проекта, сливает функцию в официальный репозиторий и закрывает запрос pull.

Далее в этом разделе описывается, как запрос pull может использоваться в различных процессах совместной работы.

Использование запросов pull в рабочем процессе с функциональными ветками

В жизненном цикле функциональной ветки для организации совместной работы используется общий репозиторий Bitbucket, в котором разработчики создают новый функционал в изолированных ветках. Но вместо немедленного слияния кода с веткой main разработчики должны создать запрос pull, чтобы начать обсуждение функциональной ветки до ее включения в основную базу кода.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

В процессе Feature Branch существует только один публичный репозиторий, поэтому исходный и целевой репозитории в запросе pull всегда будут совпадать. Обычно разработчик указывает свою функциональную ветку в качестве исходной, а ветку main — в качестве целевой ветки.

Получив запрос pull, человек, занимающийся поддержкой проекта, должен принять решение. Если функциональная ветка готова к использованию, можно выполнить слияние кода с веткой main и закрыть запрос pull. Но если в предлагаемых изменениях есть проблемы, можно оставить комментарии в запросе pull. Последующие коммиты будут отображаться рядом с соответствующими комментариями.

Кроме того, можно создать запрос pull для незавершенной функции. Например, если у разработчика возникают проблемы с реализацией определенного требования, он может создать запрос pull, содержащий его наработки. Другие разработчики могут оставить внутри этого запроса pull свои предложения или даже решить проблему, добавив дополнительные коммиты.

Использование запросов pull в рабочем процессе Gitflow

Рабочий процесс Gitflow похож на рабочий процесс с функциональными ветками, но устанавливает строгую модель ветвления, разработанную для релиза проекта. При добавлении запросов pull в рабочий процесс Gitflow разработчики получают удобное место для обсуждения ветки релиза или ветки сопровождения в ходе работы над ней.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Механизм запросов pull в рабочем процессе Gitflow аналогичен описанному выше: разработчик просто создает запрос pull, когда необходимо проверить функцию, релиз или ветку исправлений, а остальные участники команды получают уведомления через Bitbucket.

Использование запросов pull в рабочем процессе с форками

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

Для этого рабочего процесса наличие уведомления в запросе pull особенно важно, иначе человек, занимающийся поддержкой проекта, не сможет узнать о том, что другой разработчик добавил коммиты в свой репозиторий Bitbucket.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Кроме того, пул-реквесты можно использовать для совместной работы с другими разработчиками за пределами официального репозитория проекта. Например, если разработчик работал над функциональной веткой вместе с коллегой, они могут создать пул-реквест, указав в качестве назначения репозиторий Bitbucket коллеги, а не официальный репозиторий проекта. Тогда они смогут указать в качестве исходной ветки и ветки назначения одну и ту же функциональную ветку.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Два разработчика могут обсуждать и разрабатывать функцию внутри запроса pull. По окончании разработки один из них создает новый запрос pull на слияние этой функции с официальной главной веткой. Такая гибкость делает запросы pull невероятно мощным инструментом совместной работы в рамках рабочего процесса с форками.

Пример

В приведенном ниже примере демонстрируется использование запросов pull в рабочем процессе с форками. Он одинаково применим как для разработчиков, работающих в маленьких командах, так и для независимых разработчиков, участвующих в проекте с открытым исходным кодом.

В данном примере Мэри — разработчик, а Джон — человек, занимающийся поддержкой проекта. У обоих есть собственные публичные репозитории Bitbucket, и в репозитории Джона находится официальный проект.

Мэри создает форк официального проекта

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Чтобы начать работу над проектом, Мэри сначала должна создать форк репозитория Джона в Bitbucket. Для этого ей нужно войти в Bitbucket, перейти к репозиторию Джона и нажать кнопку Fork.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Указав имя и описание для репозитория, создаваемого с помощью форка, она получит копию серверной части проекта.

Мэри клонирует свой репозиторий Bitbucket

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Затем Мэри должна клонировать репозиторий Bitbucket, который она только что создала с помощью форка. Так она получит собственную рабочую копию проекта на своей локальной машине. Она может сделать это с помощью следующей команды:

Мэри разрабатывает новый функционал

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Прежде чем писать какой бы то ни было код, Мэри должна создать новую ветку для функции. Эту ветку она будет использовать в качестве исходной в запросе pull.

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

Мэри помещает функциональную ветку в свой репозиторий Bitbucket

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Закончив свою задачу, Мэри помещает функциональную ветку в собственный репозиторий Bitbucket (не в официальный репозиторий проекта) с помощью простой команды git push :

Так изменения Мэри будут доступны человеку, занимающемуся поддержкой проекта (или любым другим участникам, которым может понадобиться доступ к этим изменениям).

Мэри создает запрос pull

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

После добавления своей функциональной ветки в Bitbucket Мэри из своего аккаунта Bitbucket может создать пул-реквест, перейдя в свой репозиторий, созданный с помощью форка, и нажав на кнопку Pull request в верхнем правом углу. Отобразится форма, в которой репозиторий Мэри автоматически будет указан в качестве исходного. Мэри останется указать исходную ветку, а также репозиторий и ветку назначения.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

После создания запроса pull Джону будет отправлено уведомление через Bitbucket и (опционально) по электронной почте.

Джон просматривает запрос pull

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Джон может увидеть все созданные другими разработчиками пул-реквесты, перейдя на вкладку Pull request в своем репозитории Bitbucket. Нажав на пул-реквест Мэри, он увидит описание пул-реквеста, историю коммитов функциональной ветки и все изменения в пул-реквесте.

Но для примера представим, что Джон нашел небольшой баг в коде Мэри и хочет, чтобы он был исправлен перед слиянием. Джон может либо опубликовать комментарий к запросу pull в целом, либо выбрать определенный коммит в истории функциональной ветки и прокомментировать его.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это

Мэри добавляет дополняющий коммит

Если у Мэри есть какие-либо вопросы по поводу отзыва Джона, она может ответить внутри запроса pull, используя его как форум для обсуждения функции.

Для исправления ошибки Мэри добавляет другой коммит в свою функциональную ветку и помещает этот коммит в свой репозиторий Bitbucket, как и в первый раз. Коммит автоматически добавится в исходный запрос pull, и Джон сможет снова просмотреть изменения прямо рядом с его исходным комментарием.

Джон принимает запрос pull

Куда можно перейти отсюда

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

Готовы попробовать создать запрос pull?

Ознакомьтесь с этим интерактивным обучающим руководством.

Источник

Лучший Pull Request

Относительно недавно мне посчастливилось присоединиться к команде разработки Bitbucket Server в Atlassian (до сентября он был известен как Stash). В какой-то момент мне стало любопытно, как этот продукт освещён на Хабре, и к моему удивлению, нашлось лишь несколько заметок о нём, подавляющее большинство которых на сегодняшний день уже устарело.

В связи с этим я решил опробовать себя в роли рассказчика и затронуть техническую сторону Bitbucket. Прошу не рассматривать моё намерение как попытку рекламы, ибо я совершенно не преследую эту цель. Если эта статья обнаружит интерес со стороны читателей, я буду рад развивать тему и постараюсь ответить на возникающие вопросы.

Позвольте начать с перевода статьи Тима Петтерсена «A better pull request» о том, как должен выглядеть pull request, чтобы наиболее эффективно решать возложенную на него задачу.

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

Мне хотелось бы пользоваться привычными названиями и в письменной речи, однако некоторые термины я не буду даже транслитерировать, поскольку, на мой взгляд, они становятся слишком корявыми, и потому оставлю их в английском написании, — прошу понять и простить. С другой стороны, я открыт критике и предложениям, поэтому если вы считаете, что есть лучший способ выразить тот или иной термин, прошу делиться этими мыслями. Спасибо.

Если вы используете Git, то наверняка пользуетесь и pull request-ами. Они в той или иной форме существуют с момента появления распределённых систем управления версиями. До того, как Bitbucket и GitHub предложили удобный веб-интерфейс, pull request мог представлять собой простое письмо от Алисы с просьбой забрать какие-то изменения из её репозитория. Если они были стóящими, вы могли выполнить несколько команд, чтобы влить эти изменения в вашу основную ветку master:

Разумеется, включать изменения от Алисы в master не глядя — это далеко не лучшая идея: ведь master содержит код, который вы собираетесь поставлять клиентам, а потому наверняка хотите внимательно следить за тем, что в него попадает. Более правильный путь, чем простое включение изменений в master, — это сначала влить их в отдельную ветку и проанализировать перед тем, как cливать в master:

Приведённая команда git diff с синтаксисом трёх точек (в дальнейшем «triple dot» git diff) покажет изменения между вершиной ветки alice/branch и её merge base — общим предком с локальной веткой master, иначе говоря, с точкой расхождения истории коммитов этих веток. В сущности, это будут ровно те изменения, которые Алиса просит нас включить в основную ветку.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это
git diff master. alice/master эквивалентен git diff A B

На первый взгляд, это кажется разумным способом проверки изменений pull request-а. Действительно, на момент написания статьи, именно такой алгоритм сравнения применяется в реализации pull request-ов в большинстве инструментов, предоставляющих хостинг git-репозиториев.

Несмотря на это, есть несколько проблем в использовании «triple dot» git diff для анализа изменений pull request-а. В реальном проекте основная ветка, скорее всего, будет сильно отличаться от любой ветки функциональности (в дальнейшем feature-ветка). Работа над задачами ведётся в отдельных ветках, которые по окончании вливаются в master. Когда master продвигается вперёд, простой git diff от вершины feature-ветки до её merge base уже недостаточен для отображения настоящего различия между этими ветками: он покажет разницу вершины feature-ветки лишь с одним из предыдущих состояний master.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это
Ветка master продвигается за счёт вливания новых изменений. Результат git diff master. alice/master не отражает этих изменений master.

Почему же невозможность увидеть эти изменения в ходе анализа pull request-а является проблемой? Тому есть две причины.

Конфликты слияния (merge conflicts)

С первой проблемой вы наверняка регулярно сталкиваетесь — конфликты слияния. Если в вашей feature-ветке вы измените файл, который в то же время был изменён в master, git diff по-прежнему будет отображать только изменения, сделанные вами в feature-ветке. Однако при попытке выполнить git merge вы столкнётесь с ошибкой: git расставит маркеры конфликтов в файлах вашей рабочей копии, поскольку сливаемые ветки имеют противоречивые изменения, — такие, которые git не в состоянии разрешить даже с помощью продвинутых стратегий слияния.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это
Конфликт слияния

Вряд ли кому-то нравится заниматься разрешением конфликтов слияния, но они являются данностью любой системы контроля версий, — по крайней мере, из тех, которые не поддерживают блокирование на уровне файла (которое, в свою очередь, имеет ряд своих проблем).

Однако конфликты слияния — это меньшая неприятность, с которой вы можете столкнуться при использовании «triple dot» git diff для pull request-ов, по сравнению с другой проблемой: особый тип логического конфликта будет успешно слит, но сможет внести коварную ошибку в кодовую базу.

Логические конфликты, остающиеся незамеченными во время слияния

Если разработчики модифицируют разные части одного и того же файла в разных ветках, появляется вероятность того, что они создадут такой конфликт. В некоторых случаях разные изменения, которые исправно работают по отдельности и отлично сливаются безо всяких конфликтов с точки зрения системы контроля версий, могут внести логическую ошибку в код, будучи применёнными вместе.

Это может произойти различными путями, однако самым распространённым является вариант, когда два разработчика случайно замечают и исправляют одну и ту же ошибку в двух разных ветках. Представьте, что приведённый ниже код на javascript вычисляет стоимость авиабилета:

Здесь содержится очевидная ошибка: автор забыл включить в расчёт таможенный сбор!

Теперь представьте двух разработчиков, Алису и Боба, каждый из которых заметил эту ошибку и исправил её независимо от другого в своей ветке.

Алиса добавила строку для учёта customsFee перед immigrationFee:

Боб сделал аналогичную правку, однако поместил её после immigrationFee:

Поскольку в каждой из этих веток были изменены разные строки кода, слияние обеих с master пройдёт успешно одно за другим. Однако теперь master будет содержать обе добавленные строки, а значит, клиенты будут дважды платить таможенный сбор:

(Это, разумеется, надуманный пример, однако дублированный код или логика могут вызвать весьма серьёзные проблемы: к примеру, дыру в реализации SSL/TLS в iOS.)

Предположим, что вы сначала слили в master изменения pull request-а Алисы. Вот что показал бы pull request Боба, если бы вы использовали «triple dot» git diff:

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

На самом же деле, при анализе pull request-а вы хотели бы видеть, как master изменится после слияния изменений из ветки Боба:

Здесь явно обозначена проблема. Рецензент pull request-а, будем надеяться, заметит дублированную строчку и уведомит Боба о том, что код нужно доработать, и тем самым предотвратит попадание серьёзной ошибки в master и, в конечном счёте, в готовый продукт.

Таким образом мы решили реализовать показ изменений в pull request-ах в Bitbucket. При просмотре pull request-а вы видите, как на самом деле будет выглядеть результат слияния (т.е. фактически, результирующий коммит). Чтобы осуществить это, мы производим настоящее слияние веток и показываем разницу между получившимся коммитом и верхушкой целевой ветки pull request-а:

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это
git diff C D, где D — это коммит, получившийся в результате слияния, показывает все различия между двумя ветками

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

Продвижение веток

Во-первых, коммит слияния D на самом деле ещё не существует, а его создание — относительно дорогой процесс. Во-вторых, недостаточно просто создать коммит D и на этом закончить: B и C, родительские коммиты для нашего коммита слияния, могут поменяться в любое время. Мы называем изменение любого из родительских коммитов пересмотром (rescope) pull request-а, поскольку оно, по сути, модифицирует тот набор изменений, который будет применён в результате слияния pull request-а. Если ваш pull request нацелен на нагруженную ветку вроде master, он наверняка пересматривается очень часто.

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это
Коммиты слияния создаются каждый раз, когда любая из веток pull request-а изменяется

Фактически, каждый раз когда кто-то коммитит или сливает pull request в master или feature-ветку, Bitbucket должен создать новый коммит слияния, чтобы показать актуальную разницу между ветками в pull request-е.

Обработка конфликтов слияния

Другая проблема при выполнении слияния для отображения разницы меджу ветками в pull request-е заключается в том, что время от времени вам придётся иметь дело с конфликтами слияния. Поскольку git сервер работает в неинтерактивном режиме, разрешать такие конфликты будет некому. Это ещё больше усложняет задачу, но на деле оказывается преимуществом. В Bitbucket мы действительно включаем маркеры конфликтов в коммит слияния D, а затем помечаем их при отображении разницы между ветками, чтобы явно указать вам на то, что pull request содержит конфликты:

Bitbucket decline pull request что это. Смотреть фото Bitbucket decline pull request что это. Смотреть картинку Bitbucket decline pull request что это. Картинка про Bitbucket decline pull request что это. Фото Bitbucket decline pull request что это
Зелёные строки добавлены, красные — удалены, а жёлтые означают конфликт

Таким образом, мы не только заранее выявляем, что pull request содержит конфликт, но и позволяем рецензентам обсудить, как именно он должен быть разрешён. Поскольку конфликт всегда затрагивает, как минимум, две стороны, мы считаем, что pull request — это лучшее место для нахождения подходящего способа его разрешения.

Несмотря на дополнительную сложность реализации и ресурсоёмкость используемого подхода, я считаю, что выбранный нами в Bitbucket подход предоставляет наиболее точную и практичную разницу между ветками pull request-а.

Автор оригинальной статьи — Тим Петтерсен, участвовал в разработке JIRA, FishEye/Crucible и Stash. С начала 2013 года он рассказывает о процессах разработки, git, непрерывной интеграции и поставке (continuous integration/deployment) и инструментах Atlassian для разработчиков, особенно о Bitbucket. Тим регулярно публикует заметки об этих и других вещах в Twitter под псевдонимом @kannonboy.

Надеюсь, что эта статья оказалась интересной. Буду рад ответить на вопросы и комментарии.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *