Git: командная работа
Все приличные команды разработки работают с таск-трекерами, сейчас как мне кажется стандартом стал Jira
(ну или другой трекер, суть та же для примера). Поэтому здесь для
примера буду писать "таск" или "тикет" подразумевая задачу в Jira.
Хорошим тоном сейчас считается указание идентификатора таска в каждом
коммите который для решения этого таска делается. Не претендую на истину
в последней инстанции, но как один из возможных вариантов опишу здесь
свой опыт. Могу дополнить только что для SVN пользовался практически той
же схемой, за исключением того, что ветвление на каждую задачу
значительно безопаснее как мне кажется, но об этом ниже.
Итого:
Что касается git, то описанный процесс происходит примерно так:
Итого:
- В команде есть NN разработчиков
- Все разработчики используют единый репозиторий git
- В репозитории существуют две (может быть для каких-то целей и больше) основные ветки master и dev
- Ветка master существует исключительно для стабильных версий продукта, работающих только в боевой (продакшн) зоне. То есть эта ветка считается последней стабильной версией ПО с которой работают конечные пользователи. Перед каждым релизом на эту ветку ставится тег, с которого собственно и выкатывается стабильная версия. В случае каких-то проблем на боевой откатывается на предыдущий стабильный тег этой ветки (если такой откат возможен конечно после внесенных изменений в БД или какие-то другие жизненно важные части по).
- Ветка dev (development) служит для аккумулирования изменений всех изменений разработчиков и собственно обмена последними стабильными изменениями между разработчиками.
- Для каждой новой задачи разработчик создает новую ветку от текущей dev и работает в ней, с нее же получая для своей задачи обновления по необходимости
- При передаче в тест разработчик синхронизирует свою ветку с текущей dev и отдает на тестирование свою задачу именно на ветке этой задачи
- После тестирования разработчик мерджит свою ветку в dev и либо сам проверяет что ничего не сломалось уже на dev либо это опять проверяют тестеры
- Перед релизом dev ветка мерджится на master, после чего на мастере ставится тег с которого производится деплой свежего релиза
Что касается git, то описанный процесс происходит примерно так:
-
Клонируем репозиторий в папку (если необходимо)
cd /my/project/folder git clone ssh://luke@tatuin.com/git/project-repo .
-
Переключаемся на dev ветку и обновляем ее
git checkout dev git pull origin dev
-
Ветвимся от dev в ветку под конкретную задачу (для примера имя ветки здесь это ключ от таска в Jira)
git checkout -b task-123 git status
-
Теперь спокойно работаем на этой ветке и все коммиты по задаче идут на неё
git commit -am 'task-123 my task commit'
-
Если задача затянулась, то можно подтянуть на ветку обновления от других разработчиков
git pull origin dev
-
Когда задача закончена, и все коммиты по ней отправлены на соответствующую ветку отправляем свою ветку в общий репозиторий
git push origin test-123
-
Посмотреть все лоакльные ветки можно вот так
git branch
git branch --remote
-
Теперь задачу нам вернули из теста, с ней все хорошо, нужно вмерджить свои изменения в dev ветку
git checkout dev git pull origin dev git merge test-123
git push origin dev
-
Теперь желательно прибрать за собой, то есть убрать больше не нужные ветки. Сначала удалим ветку из удаленного репозитория
git push origin :test-123
git branch -d test-123
- Работа на другой ветке (забыл переключиться в спешке), тут может выручить stash. С его помощью можно спрятать изменения, а потом выложить их на другой ветке после переключения на неё, важно внимательно смотреть в diff при коммитах чтобы не потереть чужое.
- Пуш в другую ветку, тут нужно просто быть внимательным при каждом push-e.
- Ошибки связанные с мерджем, тут тоже нужно помнить что нужно сначала перейти в ветку в которую будем мерджить свои изменения, а уже потом мерджить в неё свою ветку. Нужно просто быть внимательным.