Блог экспериментатора инженера-разработчика: Infanty.
Я пишу how-to статьи на редкие темы или статьи обзоры - для себя и тех кто со мной работает.
Блог существует при поддержке: "Оккупационных сил Марса".

Основная ветвь и ветвь разработки.

Центральный репозиторий содержит две главные ветви, существующие всё время:

  • master - главная ветвь. Весь исходный код в ней должен иметь возможность быть размещённым в проекте (на сайте) в любой произвольный момент времени.
  • develop - главная ветвь для разработки. Хранящийся в ней код в любой момент времени должен содержать самые последние изданные изменения, необходимые для следующего релиза. От данной ветви также делаются ответвления при разработке, которые должны войти в следующий релиз.

Ветви разработки.

  • Создаются от ветви: develop.
  • После завершения разработки в ветви разработки, она вливается в ветвь: develop.
  • Соглашение о наименовании: всё, за исключением: master, develop, release-* или hotfix-*.

Создание локальной ветви feature-tkt-32 путём клонирования ветви develop

Для создания локальной ветки разработки - скопируем репозитарий, переключюмся на ветвь master и создадим на основе неё локальную ветвь:

  • git clone https://github.com/facebook/react.git
  • git checkout master
  • git checkout -b feature-tkt-32 origin/develop

Или же используем TortoiseGit:

  • На сайте GitLab или GitHub переходим в папку конкретного проекта. Копируем адрес репозитария со страницы конкретного проекта. Например, адреса репозитария может быть таким: https://github.com/facebook/react.git.
  • После чего, в папке где будет хранится разрабатываемый код, нажимаем один раз правой кнопкой мыши и в выпадающем меню выбираем: Git Clone.... В появившемся окне вводим в поле URL: SSH адрес репозитария, а в поле: Load Putty Key выбираем ранее сгенерированный приватный ключ (в GitLab или GitHub уже должен быть добавлен публичный ключ доступа), после чего жмем: Ок для загрузки данных репозитария.
  • Жмем правую кнопку мыши на директории загруженного репозитария и выбираем в меню: TortoiseGit —> Create Branch... для создания ветви. В открывшемся окне задаём название новой ветви и указываем на основании какой ветви репозитория она будет создана, деактивируем опцию: Track, после чего жмем: Ок, для подтверждения создания ветви. Например, в поле: Base On может быть указана ветвь: remotes/origin/develop на основании которой будет создана новая ветвь.
  • Жмем правую кнопку мыши на директории репозитария, и выбираем в меню TortoiseGit —> Switch/Checkout… для переключения активной ветви в локальном репозитарии. В открывшемся окне выбираем созданную ветвь и жмём «Ок». Убеждаемся в успешном переключении - увидев в окне лога TortoiseGit: Switched to branch 'feature-tkt-32'.

Разработка в бранче: внесение правок в ветвь и отправка изменений в репозитарий

После внесения изменений в локальные файлы ветви и создания новых файлов в ветви, сохраним изменения в локальной ветви и отправим их в центральный репозитарий используя консоль:

  • git status
  • git add <some-file>
  • git commit -m "tkt-32 Do subtask"
  • git push -u origin feature-tkt-32

Последняя команда отправляет ветвь: feature-tkt-32 в главный репозиторий (origin). При этом флаг: -u (--set-upstream), устанавливает отслеживание и связывает локальную ветвь: feature-tkt-32, с ветвью origin/feature-tkt-32. После того как флаг: -u, был установлен, все дальнейшие команды: git push, для ветви: feature-tkt-32, можно выполнять без дополнительных параметров.

Или же используем TortoiseGit:

  • Жмем правую кнопку мыши на директории репозитория и выбираем в меню: Git Commit -> "feature-tkt-32"... для сохранения изменений в локальной ветви. В открывшемся окне вводим в поле: Message описание правки: tkt-32 Do subtask. После чего выбираем изменённые или новые локальные файлы - которые нужно изменить или добавить в ветвь и нажимаем кнопку: Ок.
  • Жмем правую кнопку мыши на директории репозитория и выбираем в меню: TortoiseGit —> Push... для отправки изменений из локальной ветви в ветвь в центральном репозитарий. В открывшемся окне в поле: Local выбираем локальную ветвь с которой производится работа: feature-tkt-32, а в поле: Remote выбираем ветвь: feature-tkt-32 из репозитария, после чего и жмём кнопку: Ок. Примечание: при первой отправке локальной ветви в репозитарий, она не существует в нём. Поэтому при первой отправке ветви в репозитарий, в поле: Remote необходимо ввести название - идентичное названию локальной ветви. После чего, при отправке изменений в репозиторий: будет создана новая ветвь в репозитарии, с сохранением в неё отправленных данных локальной ветви.

Слияние ветвей

Для слияния двух ветвей - переключимся на ветвь develop, получим по ней изменения из репозитория, вольём в неё изменения из ветви feature-tkt-32 и отправим изменения ветви develop в центральный репозитарий используя консоль:

  • git checkout develop
  • git pull origin develop
  • git merge --no-ff feature-tkt-32
  • git push origin develop

Флаг --no-ff вынуждает Git всегда создавать новый объект коммита при слиянии, даже если слияние может быть осуществлено алгоритмом fast-forward. Это позволяет не терять информацию о том, что ветвь существовала, и группирует вместе все внесённые изменения.

Или же используем TortoiseGit:

  • Жмем правую кнопку мыши на директории репозитария, и выбираем в меню TortoiseGit —> Switch/Checkout… для переключения активной ветви в локальном репозитарии. В открывшемся окне выбираем ветвь: remotes/origin/develop, деактивируем опцию: Track, а так же деактивируем опцию: Create New Branch и жмём: Ок. Если ветвь на которую производится переключение ещё не создавалась локально, то не нужно деактивировать опцию: Create New Branch, иначе не будет создана локальная копия ветви.
  • Для обновления локальной ветви, жмём правую кнопку мыши на директории репозитария, и выбираем в меню TortoiseGit -> Pull…. В поле: Remote оставляем значение: origin, а в поле: Remote Branch оставляем имя текущей локальной ветви: develop.
  • Для слияния ветвей, жмём правую кнопку мыши на директории репозитария, и выбираем в меню TortoiseGit -> Merge.... В открывшемся окне выбираем ветвь: remotes/origin/feature-tkt-32 (можно выбрать и локальную версию данной ветви, если она имеет актуальное состояние), активируем опцию: No Fast Forward и жмём: Ок. После чего ветвь: remotes/origin/feature-tkt-32 будет слита с главной ветвью для разработки: develop.
  • Жмем правую кнопку мыши на директории репозитория и выбираем в меню: TortoiseGit —> Push... для отправки изменений из локальной ветви в ветвь в центральном репозитарий. В открывшемся окне в поле: Local выбираем локальную ветвь с которой производится работа: develop, а в поле: Remote выбираем ветвь в репозитарии: develop, после чего и жмём кнопку: Ок.

Удаление ветви

Для удаления ветви локально и в репозитарии, наберём в консоли:

  • git branch -d feature-wds-101
  • git push origin :feature-wds-101

Или же используем TortoiseGit:

  • Жмём правую кнопку мыши на директории репозитария, и выбираем в меню TortoiseGit -> Switch/Checkout…. После чего напротив поля: Branch жмём кнопку: .... В новом открывшемся окне в разделе: heads выбираем локальную ветвь, кликаем по ней правой кнопкой мыши и выбираем в выпадающем меню: Delete branch для удаления локальной ветви. Аналогичным образом, удаляем в разделе: remotes больше не нужные ветви в центральном репозитарии.

Ветви релизов

  • Создаются от ветви: develop.
  • После завершения разработки в ветви релиза, она вливается в ветвь: develop и master.
  • Соглашение о наименовании: release-*.
  • После вливания ветви в: develop и master, в ветвь: master проставляется соответствующий тег:
Добавление тега в ветвь master:
  • git checkout master
  • git tag -a 0.1 -m
  • "Initial public release"
  • git push --tags

Ветви исправлений

  • Создаются от ветви: master.
  • После завершения разработки в ветви исправления, она вливается в ветвь: develop и master.
  • Соглашение о наименовании: hotfix-*.
  • После вливания ветви в: develop и master, в ветвь: master проставляется соответствующий тег.
  • Исключение: если в данный момент существует ветвь релиза (release branch), то ветвь исправления (hotfix branch) должна вливаться в неё, а не в ветвь разработки (develop). В этом случае исправления войдут в ветвь разработки вместе со всей ветвью релиза, когда та будет закрыта.

Создание локального репозитария в Linux, с помещением в него текущего сайта и отправкой в bitbucket.org

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

  • cd /var/www/example.com
  • git init
  • git remote add origin https://user@bitbucket.org/folder/project.git
  • git add .
  • git commit -m 'Import site files'
  • git push -u origin master

Обновление сайта на сервере из ветви: master

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

  • git pull origin master
  • git clean -d -fx ""

Где:

  • -x удаление неотслеживаемых и игнорируемых файлов в папке текущей ветви.
  • -d удаление неотслеживаемых каталогов в папке текущей ветви.
  • -f принудительный запуск на выполнение всех удалений, без лишних вопросов и т.п.

Дополнительные полезные команды Git

  • git fetch --all - загружает файлы из репозитария, не пытаясь объединить их с уже имеющимися файлами, а перезаписывая их при совпадении имён.
  • git reset --hard origin/master - сбрасывает все изменения файлов в текущей локальной ветви, чтобы они соответствовали файлам из ветви origin/maste