2015-03-28 3 views
20

Большинство рабочих процессов git, которые я видел, предлагают удалить branch после того, как он был объединен с мастером. Например, это gitflow предлагает следующее:Почему я должен удалять ветки функций при объединении с мастером

# Incorporating a finished feature on develop 
$ git checkout develop 
Switched to branch 'develop' 
$ git merge --no-ff myfeature 
Updating ea1b82a..05e9557 
(Summary of changes) 
$ git branch -d myfeature 
Deleted branch myfeature (was 05e9557). 
$ git push origin develop 

Почему я должен удалить ветку? Я также занимаюсь любопытством, что делать, когда позже обнаруживается ошибка, которая была введена этой функцией. Должен ли я снова создать ветку с тем же именем, исправить ошибку там, слить в master и снова удалить ветвь?

+1

Потому что ваша функция закончена. Какая же необходимость сохранить ветвь, тем самым загромождая результат ветви git -a и т. Д.? –

+0

@OliverCharlesworth история –

+0

@ Z.Khullah - Забытия все еще будут в истории. –

ответ

33

Что-то важное для реализации - ветки Git - это не что иное, как ярлык, указывающий на фиксацию. Ветвление в Git буквально разветвляется. Вот что такое хранилище выглядит как если feature ответвляется master когда master был коммита B.

A - B - C - F - H [master] 
    \ 
     D - E - G - I[feature] 

См? Фактическая ветвь. Когда вы введете git merge feature в мастера, вы получите это.

A - B - C - F - H - J [master] 
    \   /
     D - E - G - I [feature] 

И как только вы git branch -d feature история отрасли остается!

A - B - C - F - H - J [master] 
    \   /
     D - E - G - I 

J имеет родителей H и I. J не может существовать без них, это запекается в том, как работает Git. Я не могу существовать без G. G не может существовать без E. И так далее. Филиал должен оставаться

J - это слияние, которое, как правило, будет содержать имя ветки, которая будет объединена. Это похоже на любую другую фиксацию, поэтому вы можете добавить к ней больше информации, например, ссылку на ваш трекер.

git merge --no-ff используется, чтобы Git не выполнял «быструю перемотку вперед» и не терял историю ветвей. Это происходит, если не была выполнена работа над master, так как была создана ветка. Быстрая перемотка выглядит так.

A - B[master]- D - E - G - I [feature] 

git checkout master 
git merge feature 

A - B - D - E - G - I [feature] [master] 

Поскольку master является прямым предком feature, не требуется никакого слияния. Git может просто переместить лейбл master. История вашего филиала потеряна, похоже, что D, E, G и я все были сделаны как отдельные фиксации на хозяине. git merge --no-ff говорит Git, чтобы никогда не делать этого, чтобы всегда выполнять слияние.

В будущем, когда в G обнаружена ошибка, любой, кто просматривает репозиторий, может видеть, что это было сделано как часть ветки, загляните вперёд, чтобы найти фиксацию слияния и получить информацию о ветке оттуда.

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

Во-вторых, и, что более важно, это предотвращает повторное использование ветви. Ветвление и слияние сложны. Однопользовательские, недолговечные ветви функций упрощают процесс, гарантируя, что вы только сливаете ветвь обратно в мастер один раз. Это устраняет многие технические проблемы и проблемы управления. Когда вы объединяете ветку, это сделано. Если вам нужно исправить проблему, появившуюся в этой ветке, просто рассматривайте ее как ошибку в главном и создайте новую ветку, чтобы исправить ее.

К сожалению, git log принадлежит пользователю и представляет линейное представление истории, не являющейся линейной. Чтобы исправить это, используйте git log --graph --decorate. Это будет рисовать строки, как в моих примерах выше, и показывать вам любые ветки и теги для каждой фиксации. Вы получите более точное представление о репозитории.

Если вы находитесь на Mac, GitX отобразит репозиторий для вас. gitk - это общая версия.

+0

Спасибо за ваш ответ! Не могли бы вы переместить часть, которая начинается с _why удалять ветку_ до объяснения того, что ветка git так, что кто-то ищет тот же ответ получает ответ прямо вверху :). Ответ VonC также очень полезен, возможно, вы могли бы включить часть своего ответа в свой ответ, чтобы сделать его одним полным источником информации. Благодаря! –

+0

@Maximus IMO, не понимая, как работают ветки Git, мои рассуждения об удалении ветки не имеют смысла. Что касается ответа VonC, я не вижу, что в нем, что я не покрывал; не могли бы вы уточнить? – Schwern

+0

Возможно, вы правы, может быть, потому, что я знаю все, что я не видел в нем как необходимые знания. Я нахожу этот ответ VonC очень полезным: _В случае, когда история myfeature branch представляет собой все промежуточные фиксации, выполненные для реализации myfeature. Эта стратегия удерживает только одну фиксацию в мастерской и забывает о промежуточных шагах, что имеет смысл для долгоживущих ветвей, _ –

1

Потому что история отрасли myfeature представляет собой все промежуточные фиксации, выполненные для реализации myfeature.

Эта стратегия сохраняет только одну фиксацию в master и забывает о промежуточных шагах, что имеет смысл для долгоживущих ветвей, как я объяснил в «Why does git fast-forward merges by default?».

Сообщение о совершении одного совершения (объединенное) в master должно дать понять, что оно выполнено для реализации «myfeature».

Если это необходимо, имя филиала можно повторно использовать (поскольку оно было удалено ранее).

+0

Спасибо. Что вы подразумеваете под недолговечными ветвями? Существуют ли какие-либо отличия от ветвей признаков? Кроме того, как я понимаю, информация о ветке должна храниться в фиксации слияния, когда ветвь функции объединяется в master? –

+0

Не могли бы вы также взглянуть на комментарий, который я оставил для вашего ответа [здесь] (http://stackoverflow.com/a/29296584/2545680)? –

+1

@Maximus http://stackoverflow.com/a/2850413/6309 иллюстрирует ветвь с прямой трансляцией (всего несколько коммитов, которые быстро объединяются в мастер), в отличие от ветви с длинным живым телом, где будет сделано много коммитов (с проб и ошибок) до того, как они будут объединены * в конечном итоге * для освоения: во втором случае чище держать только одну фиксацию в мастер. – VonC

Смежные вопросы