Правильная схема рабочего процесса git с несколькими разработчиками, работающими над одной задачей

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

У нас есть репозиторий в Bitbucket. Ветка Master считается содержащей только стабильный код. Каждый разработчик должен создать свою собственную ветку и реализовать функции/исправления ошибок в своей собственной ветке. Как только он решает, что его код готов, он создает красивую историю веток (используя перебазирование, исправление, выбор вишни и т. д.) и отправляет ее в Bitbucket, где создает запрос на включение в основную ветку. QA проверяет функциональность и одобряет (или не одобряет) ее, затем я проверяю код, и если все в порядке, я объединяю его работу с мастером (путем быстрой перемотки вперед или перебазирования для лучшей истории коммитов).

Но эта схема хороша только в том случае, когда на ветке работает один разработчик. В нашем случае у нас почти всегда два разработчика на одну ветку, так как один разработчик работает над серверной (PHP), а другой - клиентской (HTML/CSS /JS). Как эти двое должны взаимодействовать таким образом, чтобы история коммитов в мастере оставалась чистой?

Серверный разработчик создает базовую структуру файлов HTML, а клиентский разработчик должен получить эту структуру. Логично было бы для разработчика сервера создать ветку, а для разработчика клиента создать свою собственную ветку на основе ветки разработчика сервера. Но это означает, что разработчик сервера должен опубликовать свою ветку в Bitbucket, что сделает для него невозможным перебазирование или изменение коммитов, которые уже опубликованы.

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

Как вы справляетесь с таким сотрудничеством в своих рабочих процессах?


person Viktor Livakivskyi    schedule 13.02.2013    source источник
comment
Разработчику сервера не нужно публиковать в Bitbucket. Он может публиковать другими способами, а клиентский разработчик может получать данные из другого места. (Они могут посылать пакеты по электронной почте друг другу, или получать напрямую, или использовать другой общий сервер...) У вас все еще есть проблемы с перебазированием, но теперь оно ограничено двумя разработчиками.   -  person William Pursell    schedule 14.02.2013
comment
@WilliamPursell, да, это может быть вариант, о котором я тоже думал, но я не хотел задействовать сторонние решения, такие как электронная почта, общий сервер или что-то еще. Прямое вытягивание кажется одним из предпочтительных способов, но может усложнить работу клиента-разработчика, так как ему нужно будет вытягивать из Bitbucket и всех серверов-разработчиков, с которыми он работает — будет бардак со всеми пультами. Спасибо за совет!   -  person Viktor Livakivskyi    schedule 14.02.2013
comment
что сделает невозможным для него перебазирование или изменение коммитов, почему это так? Ваш SCM не должен применять такие правила к личным веткам. Измените свой SCM, чтобы только master был защищен от перезаписи.   -  person dss539    schedule 10.09.2019


Ответы (8)


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

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

Мастер золотой; его касается только мастер слияния (подробнее об этом чуть позже).

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

Для каждой незаметной функции (ошибка, улучшение и т. д.) создается новая локальная ветка из dev. Разработчикам не обязательно работать над одной и той же веткой, поскольку область действия каждой функциональной ветки ограничена только тем, над чем работает отдельный разработчик. Вот тут-то и пригодится дешевое ветвление git.

Как только функция готова, она локально объединяется с разработчиком и переносится в облако (Bitbucket, Github и т. д.). Все синхронизируются, часто подключая dev.

У нас еженедельный график выпуска, поэтому каждую неделю, после того как QA утверждает ветку разработки, создается ветка выпуска с датой в названии. Это ветка, используемая в производстве, заменяющая ветку релиза на прошлой неделе.

Как только релизная ветвь проверена QA в рабочей среде, релизная ветвь снова объединяется с основной (и dev, просто на всякий случай). Это единственный раз, когда мы касаемся мастера, следя за тем, чтобы он был максимально чистым.

Это хорошо работает для нас с командой из 12 человек. Надеюсь, это было полезно. Удачи!

person bronzehedwick    schedule 14.02.2013
comment
Спасибо за описание потока! Я думаю, мы можем взять это за основу для нашего потока. Мне нравится идея ветки «выпуск», так как в ней будут решаться проблемы, оставленные для следующего релиза, но новые функции могут быть разработаны в ветке «разработка», не мешая материалам релиза. Единственное, что меня смущает - здесь пулл-реквесты будут бесполезны и код-ревью нужно организовывать по-другому. - person Viktor Livakivskyi; 14.02.2013
comment
Не за что, рад, что оказался полезным! Что касается проблемы с запросами на вытягивание, это правда, что мы не используем запросы на вытягивание в нашей модели, поэтому я не знаю, как они будут работать с использованием этого метода. Однако теоретически вы все равно можете создать локальную ветку билета от разработчика и использовать ее в качестве запроса на включение. Кроме того, возможно, следует рассмотреть возможность использования патчей (git format-patch). Это рабочий процесс, который использует drupal.org. - person bronzehedwick; 14.02.2013
comment
Думаю, что изменю схему на пост-ревью с пре-ревью. Для разработчиков будет обязательным правилом добавлять номер задачи Jira к каждому коммиту, который они отправляют на сервер Bitbucket, чтобы я мог в любое время увидеть все коммиты, связанные с любой проблемой, и повторно открыть их, если я этого не сделаю. как некоторые из коммитов. Это не заставит меня выступать узким местом в проекте, поскольку мне не нужно будет проверять каждое изменение до того, как дело дойдет до ветки «разработка». - person Viktor Livakivskyi; 15.02.2013
comment
Звучит как план. На самом деле мы добавляем имя тикета в начале заголовка наших сообщений о фиксации, также известное как MY-PROJECT-13: message, как вы и предлагаете. Добавление его в начало заголовка имеет дополнительное преимущество, заключающееся в том, что плагин Jira Git подбирает имя заявки и назначает фиксацию для заявки в Jira (хотя регистр чувствителен). - person bronzehedwick; 16.02.2013
comment
Да, именно об этом я и думаю. Большое спасибо за ваши советы! Это может быть болезненный путь, пока я, наконец, не приземлюсь на эту схему :) - person Viktor Livakivskyi; 16.02.2013
comment
Что произойдет, если несколько человек работают над заявкой, и для этой заявки существует ветка? Разве это не означает, что над одной веткой будет работать несколько человек? Как это работает? - person Ogen; 26.01.2016
comment
@Ogen Этот рабочий процесс предполагает, что вы будете разбивать более крупные задачи на достаточно маленькие фрагменты, чтобы только один разработчик работал над этой конкретной веткой функций одновременно. Это держит вещи в здравом уме в моем опыте. Большая работа по-прежнему выполняется над всеобъемлющей задачей, но она разбита на управляемые части, которые берут на себя отдельные разработчики. Каждый может оставаться в курсе последних событий, часто объединяя ветку разработки и сливаясь с веткой разработки, когда функция будет завершена. - person bronzehedwick; 27.01.2016
comment
Отличный рабочий процесс, мне нравится этот метод работы с несколькими разработчиками над одним проектом. - person Muhammad Imran; 22.07.2017
comment
Отличный рабочий процесс. Я обязательно поделюсь и реализую это со своей командой. Вопрос. Не лучше ли было бы иметь отдельную ветку удаленного разработчика, просто чтобы обеспечить безопасность прогресса, пока они работают над функцией? Предположим, разработчику требуется около 2 недель, чтобы завершить функцию. Он/она получает последнюю версию «origin/dev» и создает свой «local/feature-abc» из ветки «local/dev». Разработчик планирует объединить код с веткой разработки и отправить его на удаленную разработку после выполнения задачи. Теперь, если по какому-то несчастному случаю, код удаляется. Весь прогресс разработчика теряется. - person Murtuza; 23.06.2018
comment
Привет, Муртуза, спасибо за публикацию. Да, в этом рабочем процессе — или любом рабочем процессе git, я бы сказал — вы должны синхронизировать все локальные ветки с удаленной копией по крайней мере один раз в день, чтобы избежать катастрофы. Если разработчик работает над более крупной функцией, он должен продолжать извлекать удаленную ветку разработки и либо объединять (более простая и беспорядочная история), либо перемещать (более сложная, чистая история) ветку разработки в свою локальную ветку, чтобы сохранить возможное слияние локальной ветки в чистоте. . Надеюсь, это поможет! - person bronzehedwick; 24.06.2018
comment
Удивительный ответ и объяснение. Спасибо @bronzehedwick - person Krish; 07.04.2020
comment
Нет проблем @Krish, рад, что это было полезно. - person bronzehedwick; 08.04.2020

Я думаю, до сих пор никто толком не ответил на первоначальный вопрос о том, как сотрудничать в тематических ветках, сохраняя чистую историю.

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

Лучшее, что вы можете сделать в вашем конкретном случае, когда серверный разработчик не заботится об изменениях клиентского разработчика, — это локально разветвить клиентские ветки от dev/feature и перебазировать эту часть поверх работы сервера непосредственно перед завершением функции — или ослабить ваши ограничения. и переключитесь на другой рабочий процесс, как и вы;)

person Diego V    schedule 29.04.2014
comment
Благодарим вас за вклад. После того, как был задан этот вопрос, прошло больше года, и я могу добавить, что сейчас мы придерживаемся Git Flow и пытаемся сделать наши ветки функций не очень длинными. Для ветвей функций не применяются строгие правила, кроме сообщений фиксации. Эта схема не идеальна, но достаточно плавна и доказала свою надежность. - person Viktor Livakivskyi; 07.05.2014
comment
Пожалуйста. Возможно, этот ответ также может помочь с очисткой истории ваших ветвей функций: stackoverflow.com/a/23476398/1385678 - person Diego V; 07.05.2014
comment
@DiegoV Так верно. Ответы, данные до сих пор, сосредоточены на общей картине. Что, если два разработчика работают над одной функцией, которая займет несколько спринтов? Простой вопрос о ежедневном сотрудничестве. - person Josef.B; 06.04.2019

У нас есть основной репозиторий, и у каждого разработчика есть его форк.

Создается ветвь принципал/некоторый_проект, затем создается ветка с тем же именем для каждой ветки разработчиков, вилка/некоторый_проект.

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

У каждого разработчика также есть локальная ветвь с именем some_project.

Локальная ветвь разработчиков some_project отслеживает удаленную ветку принципал/some_project.

Разработчики выполняют свою локальную работу в ветке some_project и отправляют ее в свой форк/some_project, время от времени они создают запросы на вытягивание, таким образом работа каждого разработчика объединяется в main/some_project.

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

Это нормально, и все, что сейчас нужно, — это способ слияния текущих обновлений, которые появляются в принципале/мастере (например, срочные исправления или другие проекты, которые доставляются до того, как будет завершен какой-то_проект).

Для этого мы назначаем «руководителя ветки», его роль заключается в локальном слиянии обновлений из master в some_project с использованием слияния (а не извлечения, перебазирования) в SmartGit. Это также может иногда вызывать конфликты, и они должны быть разрешены. Как только это будет сделано, разработчик (руководитель ветки) принудительно отправляет в свою ветку fork/some_project, а затем создает запрос на слияние для слияния с веткой принципал/some_project.

После слияния этого запроса на вытягивание все новые коммиты, которые были в принципале/мастере, теперь присутствуют в ветке принципал/некоторый_проект (и ничего не было перебазировано).

Поэтому в следующий раз, когда каждый разработчик будет работать с some_project и будет извлекать (напомним, их отслеживаемая ветвь — main/some_project), он получит все обновления, которые будут включать в себя материал, слитый из принципала/мастера.

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

person Hugh    schedule 19.01.2017

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

Это зависит от вашей аудитории. «Разработчик сервера» может передать «базовую структуру» в Bitbucket, чтобы «разработчик клиента» имел к ней доступ. Да, это потенциально означает, что другие будут иметь доступ к этим "временным" фиксациям.

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

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

person Steven Penny    schedule 14.02.2013
comment
Спасибо за ваши советы. Я долго колебался между вашим решением и решением @bronzehedwick, но решил реорганизовать свой разработанный поток, пока не поздно :) - person Viktor Livakivskyi; 14.02.2013

Правила, которые следует помнить:

  • Иметь 1 master и 1 develop ветвь
  • Ветки функций появляются из ветки develop
  • Каждый раз, когда у вас есть версия, готовая для QA тестирования, объединяйте ее в develop.
  • Ветки релиза появляются из ветки develop
  • Внесите исправления в ветки релизов
  • Когда у вас будет готовая версия для QA тестирования, объедините ее в develop
  • Когда у вас будет готовая версия для PRODUCTION, объедините ее с master и создайте для нее тег.

На следующей диаграмме показана стратегия «бычьего глаза», которой следуют команды по всему миру >здесь):

введите здесь описание изображения

person Nirav Bhatt    schedule 17.08.2018
comment
SCM - это такая сложная область, что единственный разумный способ закончить предложение, начинающееся словами. Правила, которые нужно помнить, это... это ...использовать инструмент SCM. Почти все остальное зависит от проекта, команды, рабочего процесса и/или компании. - person Tomislav Nakic-Alfirevic; 10.01.2020

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

Первым делом наш тимлид создал git-проект с двумя ветками

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

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

Теперь в вечернее время (или, скажем, время закрытия - уход), мы делаем это:

  1. Git Pull

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

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

Например

  • dev1 создает коммит и отправляет на сервер
  • dev2 снова тянет и создает коммит и пуш
  • dev3 снова тянет и создает коммит и пуш
  • и так далее..

Теперь проблема в конфликтах:

  • Иногда при извлечении кода из ветки разработки git уведомляет, что мы автоматически объединили все конфликты --- это означает, что git автоматически применил новые изменения, сделанные другим разработчиком.
  • Но иногда ЖЕ git сообщает, что автоматическое слияние не удалось, и показывает некоторые имена файлов.
  • затем на сцену выходит роль руководителя группы — вот что он делает: «Он просматривает все перечисленные файлы (во время неудачного автоматического слияния) и вручную объединяет конфликты, создает фиксацию и отправку на сервер.

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

<<< HEAD
New lines from server that you don't have is here shown
=====
Your current changes....
>>> [commit id]

Руководитель группы обновляет этот файл после анализа следующим образом:

 New lines from server that you don't have is here shown
 Your current changes

и создает commit и push.

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

person Mohan Sharma    schedule 04.06.2016
comment
Не будет ли очень хлопотно, если число разработчиков сильно увеличится? - person Sidhin S Thomas; 04.07.2017
comment
Да, это будет. Это применимо, когда у вас есть небольшая команда. - person Mohan Sharma; 28.07.2017
comment
Это очень сложный и подверженный ошибкам рабочий процесс. Просто создавайте личные ветки и объединяйте их по мере необходимости. Для любого новичка в git, читающего это... не следуйте этому подходу, независимо от того, насколько мала ваша команда. - person dss539; 10.09.2019

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

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

Пример

Чтобы разработать новый экран-заставку, ведущий разработчик (или кто-то другой)

git co master
git co -b feature-splash
git push origin feature-splash

Каждый разработчик, работающий над этой функцией, делает:

git co master
git pull
git co feature-splash
git co -b my-feature-splash  // they can name their branch whatever

Теперь каждый разработчик будет разрабатывать свою ветку и создавать запросы на слияние функций на центральном сервере репозитория Git, таком как GitHub. Точно так же, как это делается для священной ветки «мастер».

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

Это не моя первоначальная идея. Я читал об этом в разных местах. Обратите внимание, что во многих статьях о рабочих процессах эта конкретная ветвь задачи на самом деле не является концепцией. Например, в одной статье у нас есть «Ветви функций обычно существуют только в репозиториях разработчиков, а не в источнике». Возможно, задача, для которой требуется более одного разработчика, всегда разбивается на подзадачи? Я думаю, если вы знаете будущее и знаете, что требуется.

person Josef.B    schedule 07.04.2019

Вы можете увидеть Git-flow, это может вам помочь

http://nvie.com/posts/a-successful-git-branching-model/

person saket    schedule 14.02.2013
comment
Спасибо за совет! Я начал думать об изменении структуры разработанных ветвей и включить «разработку» с «выпускными» ветвями. - person Viktor Livakivskyi; 14.02.2013
comment
Ответы только по ссылкам не рекомендуются, потому что ссылки могут со временем исчезнуть. - person reggaeguitar; 09.06.2020