Управление ветками

Теперь, когда вы уже попробовали создавать, объединять и удалять ветки, пора познакомиться с некоторыми приемами управления ветками, которые вам пригодятся, когда вы начнете использовать ветки постоянно.

Для начала воспользуйтесь командной строкой. Команда git branch делает несколько больше, чем просто создает и удаляет ветки. При запуске без параметров вы получите простой список имеющихся у вас веток:

> git branch
  issue-53
* main

Обратите внимание на символ *, стоящий перед веткой main: он указывает на ветку, на которой вы находитесь в настоящий момент (т. е. ветку, на которую указывает HEAD). Это означает, что если вы сейчас сделаете коммит, ветка main переместится вперед в соответствии с вашими последними изменениями.

Чтобы посмотреть последний коммит на каждой из веток, выполните команду git branch -v:

> git branch -v
  issue-53 560a09c Закончил задачу issue-53
* main     1ea5624 Merge branch 'issue-53' разрешил все конфликты

Параметры --merged и --no-merged могут отфильтровать этот список для вывода только тех веток, которые влиты или еще не влиты в текущую ветку.

Чтобы посмотреть те ветки, которые вы уже влили в текущую, можете выполнить команду git branch --merged:

> git branch --merged
  issue-53
* main

Ветка issue-53 присутствует в этом списке потому что вы ранее влили ее в main. Те ветки из этого списка, перед которыми нет символа *, можно смело удалять командой git branch -d. Наработки из этих веток уже включены в другую ветку, так что ничего не потеряется.

Чтобы увидеть все ветки, содержащие наработки, которые вы пока еще не влили в текущую ветку, выполните команду git branch --no-merged:

>git branch --no-merged
  testing

Вы увидите оставшуюся ветку. Так как она содержит еще не влитые наработки, попытка удалить ее командой git branch -d testing приведет к ошибке:

> git branch -d testing
error: the branch 'testing' is not fully merged
hint: If you are sure you want to delete it, run 'git branch -D testing'   
hint: Disable this message with "git config advice.forceDeleteBranch false"

Если вы действительно хотите удалить ветку вместе со всеми наработками, используйте параметр -D, как указано в подсказке.

Аналогичный результат будет, если вы захотите удалить такую ветку интерактивной командой Ветвь > Удалить ветвь... (Branch > Delete Branch...). Visual Studio Code покажет вам предупреждающее сообщение.

Таким образом Git страхует вас от случайной потери ваших наработок. Если вы действительно хотите удалить такую ветку и потерять наработки, вы можете нажать Удалить ветвь.

Совет:

Если в качестве аргумента не указан коммит или ветка, то параметры --merged и --no-merged покажут что уже влито или не влито в вашу текущую ветку соответственно.

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

Например, если ваша текущая ветка testing, то посмотреть ветки, еще не влитые в основную ветку main, можно следующей командой:

> git branch --no-merged main
  topicA
  featureB

Переименовать ветку

Предупреждение: Не переименовывайте ветки, которые все еще используются другими участниками. Не переименовывайте ветку в main (master или mainline), не прочитав раздел Изменить имя главной ветки.

Предположим, у вас есть ветка с именем ветка-с-плохим-именем, и вы хотите переименовать ее в хорошая-ветка, сохранив при этом всю историю. Вместе с этим, вы также хотите изменить имя ветки на удаленном сервере (GitHub, GitLab или другой сервер). Как это сделать?

Переименуйте ветку локально. Для этого перейдите в эту ветку и нажмите Ветвь > Переименовать ветвь... (Branch > Rename Branch...) в дополнительном меню репозитория.

В палитре команд введите новое имя ветки и нажмите Ввод.

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

Чтобы все остальные увидели исправленную ветку в удаленном репозитории, отправьте ее туда. Для этого нажмите Ветвь > Опубликовать ветвь... (Branch > Publish Branch...).

Теперь текущая ветка хорошая-ветка присутствует и на удаленном сервере.

Однако, старая ветка тоже все еще там, но ее можно удалить с помощью командной строки и команды git push:

> git push origin --delete ветка-с-плохим-именем
To https://github.com/1C-EDT-Developer/coldevex
 - [deleted]         ветка-с-плохим-именем   

Теперь старое имя ветки полностью заменено исправленным.

Изменить имя главной ветки

Предупреждение: Изменение имени главной ветки main (master, mainline, или default), сломает интеграции, службы, вспомогательные утилиты и скрипты сборки, которые использует ваш репозиторий. Прежде чем сделать это, обязательно проконсультируйтесь с коллегами. Также убедитесь, что вы выполнили тщательный поиск в своем репозитории и обновили все ссылки на старое имя ветки в вашем коде или скриптах.

Допустим, вы решили переименовать main в primary:

  1. Переименуйте локальную ветку main в primary;
  2. Опубликуйте локальную primary в удаленном репозитории;

Ваша локальная ветка main исчезла, так как она заменена веткой primary. Удаленная ветка primary доступна в удаленном репозитории.

Старая удаленная ветка main все еще присутствует в удаленном репозитории. Остальные участники будут продолжать использовать удаленную ветку main в качестве основы для своей работы, пока вы не совершите ряд дополнительных действий.

Теперь, для завершения перехода на новую ветку, перед вами стоят следующие задачи:
  • Все проекты, которые зависят от текущего, должны будут обновить свой код и конфигурацию;
  • Обновите конфигурацию всех запускаемых тестов;
  • Исправьте скрипты сборки и публикации артефактов;
  • Поправьте настройки репозитория на сервере: задайте новую ветку по умолчанию — primary, обновите правила слияния, а также прочие настройки, которые зависят от имени веток;
  • Обновите документацию, исправив ссылки, указывающие на старую удаленную ветку main;
  • Слейте или отмените запросы на слияние изменений, нацеленные на старую удаленную ветку main.
После того, как вы выполнили все эти задачи и уверены, что новая удаленная ветка primary работает так же, как старая удаленная ветка main, вы можете удалить удаленную ветку main.

По материалам книги Pro Git (авторы Scott Chacon и Ben Straub, издательство Apress). Книга распространяется по лицензии Creative Commons Attribution Non Commercial Share Alike 3.0 license.