Вчера код работал, сегодня нет
Код был удален
Появилась ошибка и никто не имеет представления почему
Если у вас была такая ситуация, то эта статья для вас.
Не считая знания команд git add
, git commit
и git push
, есть еще несколько важных техник в Git. И их знание, в общем то, сильно поможет. Здесь я расскажу о некоторых вещах, которые помогут вам использовать Git на все сто.
Процесс работы с Git
Каждый раз, когда несколько разработчиков внедрены в проект, важно правильно организовать ход работы с Git`ом. Я рассмотрю процесс, который эффективен в больших проектах с командой разработчиков.
Алгоритм
Внезапно, Вам поручили руководить проектом в котором вы планируете разработать новый Facebook. У вас в команде три разработчика:
- Элис: интерн, новичок в программировании
- Боб: имеет год опыта в программировании и знает как программировать
- Джон: имеет три года опыта в программировании и хорошо в этом разбирается
- Вы: назначены руководить проектом
Процесс разработки в Git
Master-ветка
- Master-ветка всегда должна иметь копию уже существующего кода в продакшене.
- Никто, включая руководителя, не должен работать с master-веткой напрямую, если нет копии проекта в production-ветке.
- Новый и актуальный код должен храниться в других ветках.
Release-ветка
- Когда работа над проектом начинается, первая вещь которую нужно сделать — создать release-ветку для проекта. Она создаётся из master-ветки.
- Весь код, принадлежащий проекту, должен находиться в release-ветке. Release-ветка это просто ветка с префиксом release/.
- Для примера назовем ее release/fb.
- Возможно, что несколько проектов используют один и тот же код как основу проекта. Так что для проекта создана отдельная release-ветка. Припустим, что еще один проект разрабатывается параллельно. Тогда, проект будет иметь иную release-ветку: release/messenger.
- Определенная база кода может использоваться для нескольких проектов одновременно. Во имя избежания конфликтов необходимо создавать для каждого проекта отдельную release-ветку.
Feature-ветка
- Для каждого нововведения, внедряемого в программу, создаётся feature-ветка. Это гарантирует, что нововведения будут встраиваться независимо.
- Feature-ветка идентична любой другой ветке, но с префиксом feature/.
- Сейчас Вы, будучи руководителем проекта, попросили Элис построить login-экран для Facebook. Она создает новую feature-ветку для этого. Назовем ее feature/login. Элис будет писать весь код этого нововведения только в этой feature-ветке.
- Feature-ветка создаётся, как правило, из release-ветки.
- Бобу было поручено сделать страничку поиска друзей. Так что он создает feature-ветку с названием feature/friendrequest.
- Задача Джона сделать новостную ленту. Джон создает feature-ветку названую feature/newsfeed.
- Все разработчики работают в своих feature-ветках. Пока все хорошо 🙂
- Допустим что Элис закончила работу и ее код готов. Ей нужно отправить его в release-ветку release/fb из своей feature-ветки feature/login. Это делаеться при помощи pull request`a.
Pull запрос
Прежде всего, не нужно путать pull запрос с git pull
.
Разработчик не должен вносить изменения (Прим. переводчика: пушить) напрямую в release-ветку. Руководитель проекта обязан проверить код нововведения перед его добавлением в release-ветку.
Элис может выполнить pull запрос, как предлагает GitHub — эти шаги возможны только на GitHub`е.
Сразу возле имени ветки есть опция, названая “Новый pull запрос”. При нажатии на неё открывается новый экран показанный ниже:
Здесь:
- compare-ветка должна соответствовать feuture-ветке Элис feature/fb
- base-ветка должна cоответствовать release-ветке release/fb
Как только это будет выполнено, Элис нужно ввести имя и описание для всего pull запроса и нажать на кнопку “Создать Pull Запрос”. Элис также нужно назначить обозревателя запроса. Она вводит Ваше имя, так как вы руководитель.
После этого руководитель проекта просматривает код в запросе и соединяет код feautre-ветки с кодом release-ветки.
Сейчас мы совместили код из feature/login-ветки вместе с кодом release/fb-ветки и Элис рада, что ее код был добавлен. 🙂
Конфликты кода
- Боб закончил свой код и создал pull запрос для соединения feature/friendrequest и release/fb.
- Так как release-ветка включает в себя login-код — произойдет конфликт. Разрешать конфликты и соединять код — ответственность обозревателя. В этом случае, Вы, как руководитель должны решить проблему и соединить код.
- Сейчас Джон закончил работу над своим кодом и хочет добавить его в release-ветку. Но Джон неплохо разбирается в конфликтах. Он добавляет актуальный код из release/fb-ветки в свою ветку feature/newsfeed (при помощи
git pull
илиgit merge
). Джон решает все имеющиеся конфликты. Сейчас ветка feature/newsfeed хранит весь код release/fb-ветки. - Теперь, когда конфликтов в коде уже нет, Джон делает pull request.
Так что есть два пути решения конфликтов:
- Первый: тот, кто мониторит pull запросы, должен решать конфликты.
- Второй: разработчик делает так, что последний актуальный код из release-ветки добавлен в его feature-ветку и рашает конфликты сам.
И снова о master-ветке
Как только проект закончен, код из release-ветки сливается обратно в master-ветку. Теперь код развернут в продакшене. Таким образом, код в продакшене и в master-ветке всегда синхронизированы. Обновленный код всех будущих проектов будет также доступен в master-ветке.
Перевод статьи Aditya Sridhar: How to use Git efficiently