Git разветвление и маркировка лучшие практики

141

В настоящее время я учусь использовать Git, читая Pro Git . Прямо сейчас я изучаю ветвление и теги. У меня вопрос, когда я должен использовать ветку и когда я должен использовать тег?

Например, скажем, я создаю ветку для версии 1.1 проекта. Когда я закончу и выпустлю эту версию, я должен покинуть ветку, чтобы отметить версию выпуска? Или я должен добавить тег? Если я добавлю тег, я должен удалить ветку версии (при условии, что она объединена с главной или какой-либо другой веткой)?

Код-Guru
источник

Ответы:

162

Вкратце: лучшая практика - это разветвление, частое слияние и постоянная синхронизация .

Есть довольно четкие соглашения о хранении вашего кода в отдельной ветке от основной ветки:

  1. Вы собираетесь осуществить серьезные или разрушительные изменения
  2. Вы собираетесь внести некоторые изменения, которые могут быть не использованы
  3. Вы хотите поэкспериментировать на чем-то, что вы не уверены, что это сработает
  4. Когда вам говорят разветвиться, другие могут что-то сделать в мастере

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

Хорошая практика для подражания

Успешное Гит ветвление модель от Vincent Driessen имеет хорошие предложения. Если вам подходит эта модель ветвления, рассмотрите расширение потока для git . Другие прокомментировали поток .

Метки маркировки

Как вы уже знаете, Git предоставляет вам идентификаторы коммитов, такие как 1.0-2-g1ab3183, но это не теги! Маркировка выполняется с помощью тега git, а теги, созданные с помощью тега git, являются основой для идентификаторов фиксации, которые создает git-описание. Другими словами, в Git вы не помечаете ветки. Вы помечаете коммиты. Правильно сказать, что тег - это просто аннотированный указатель на коммит.

Давайте посмотрим на практический пример, который продемонстрировал это,

                        / - [v1.0]
                       v
---. ---. --- .--- S ---.--- A <- master
                         \ 
                           \ -.--- B <- тест

Давайте сделаем коммит 'S', указанный тегом v1.0. Этот коммит как на ветке 'master', так и на ветке 'test'. Если вы запустите « git description » поверх коммита «A» (верх ветки «master»), вы получите что-то вроде v1.0-2-g9c116e9. Если вы запустите "git description" поверх коммита 'A' (он же ветвь 'test'), вы получите что-то похожее v1.0-2-g3f55e41, как в случае с конфигурацией git-description по умолчанию. Обратите внимание, что этот результат немного отличается. v1.0-2-g9c116e9означает, что мы находимся в коммите с отсортированным идентификатором SHA-1 9c116e9, 2 коммитов после тега v1.0. Там нет тега v1.0-2!

Если вы хотите, чтобы ваш тег появлялся только в ветке 'master', вы можете создать новый коммит (например, только обновить информацию о версии по умолчанию / резервной версии в GIT-VERSION-FILE) после точки ветвления ветки 'test'. Если вы пометите коммит в ветке 'test', например, 'v1.0.3`, это будет видно только из' test '.

Рекомендации

Я нашел много, много полезных блогов и постов для изучения. Однако, те, которые профессионально иллюстрированы, редки. Таким образом, я хотел бы рекомендовать пост - успешную модель ветвления Git от @nvie. Я позаимствовал его иллюстрацию :)

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

Е.Л. Юсубов
источник
4
1.0-2-g1ab3183 - это идентификатор, созданный git description из информации, доступной из git, но называть его идентификатором git - это слишком много. Git идентифицируется по хешу SHA; теги и ветви - это человеческие конструкции, которые git тщательно отслеживает. Таким образом, сделайте тег, если вы думаете, что один человек когда-нибудь захочет найти удобную закладку для коммита.
Мабрахам
2
замечательная иллюстрация многомерности во вселенной git. прекрасный. спасибо
Tope
Стоит отметить, что многие проекты не нуждаются в некоторых дорожках, показанных на этой диаграмме. Некоторые проекты нуждаются только в том, что называется разработкой и представлением здесь. Это часто верно для веб-приложений, которые могут быть развернуты по желанию.
USR
37

Ветка используется, если у вас есть 2 разные версии хранилища одновременно. Тег - это способ отметить момент времени в вашем хранилище.

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

Вы хотите удалить только те ветви, которые были объединены обратно в ГОЛОВУ [или другую ветвь].

gam3
источник
3
о ... и я предполагаю, что вы имеете в виду, что ветвь объединена с другой ветвью, такой как master. ГОЛОВА движется каждый раз, когда я делаю заказ, верно?
Code-Guru
HEAD обычно указывает на ветвь (если вы не находитесь в режиме отсоединенного HEAD), поэтому HEAD перемещается с ветвью, на которую указывает
LoicAG