Чтобы исправить баг или сделать новую фитчу в проекте, обычно создают новую ветку. Зачем? Чтобы избежать путаницы. Если бы все делалось в основной ветке, в проекте было бы сложно разобраться, особенно если над ним одновременно работает много людей.
Поэтому только по окончании работы над задачей изменения в ветке сливают в основную ветку master.
Создание ветки
Чтобы создать новую ветку testing локально, выполним команду:
$ git branch testing
На момент выполнения команды вы находились в какой-то ветке, допустим в master. Состояние этой ветки будет скопировано в ветку testing, и в testing можно будет редактировать файлы и делать снимки, не трогая пока основную ветку master.
Переключение на ветку
Предыдущая команда создаст ветку, но не переключит нас на нее, мы все еще останемся работать в старой ветке. Чтобы перейти на ветку testing и начать работать в ней, выполним команду:
$ git checkout testing
Имейте в виду, что GIT не позволит перейти на другую ветку, если в текущей ветке — в которой мы находимся — есть изменения, которые не зафиксированы (commit) либо не спрятаны (stash). Это нормально, ведь при смене ветке в текущем каталоге сменятся файлы, и git-у надо знать, как быть с текущими изменениями.
Создание и переключение единой командой
Чтобы не выполнять предыдущие команды по очереди, можно написать их одной строкой:
$ git checkout –b testing
Эта команда создаст ветку testing и сразу переключит нас на нее. Обычно именно это и требуется сделать.
Как переключиться на чью-то ветку из удаленного репозитория
Важно понимать, что GIT не позволит вам работать над чужой веткой. Принцип такой — вы создаете локальную копию чужой ветки, и над ней уже работаете.
Но для начала надо обновить локальный репозиторий — скопировать в него все ветки, которые есть в удаленном репозитории:
git fetch
Теперь можно посмотреть, какие ветки есть в удаленном репозитории:
git branch -v -a
Допустим, там есть ветка dev1. Переключимся на нее, создав локальную ветку с таким же именем:
git checkout -b dev1 origin/dev1
Вообще-то можно было написать проще:
git checkout dev1
Но:
- Эта команда сработает только в том случае, если удаленный репозиторий у вас единственный. Если их два, например origin и upstream, то непонятно, на чью ветку переключаться.
- Она создаст локальную ветку с точно таким же именем dev1. А в полной версии можно было создать локальную ветку и с другим именем mydev1:
git checkout -b mydev1 origin/dev1
Как создать подветку ветки
Обычно мы ответвляемся от основной ветки master, но не всегда. Иногда требуется сделать ответвление от созданной ветки — так сказать, ответвление второго порядка.
Предыдущая команда, с помощью которой мы создавали ветку:
$ git branch testing
создает ответвление от основной ветки master.
Если нам надо ответвиться не от основной ветки, а от вновь созданной testing, то выполним поочередно команды:
$ git checkout testing $ git checkout -b subbranch_of_testing testing
Первая команда переключит нас на ветку testing.
Вторая команда создаст ветку с именем subbranch_of_testing, ответвляющуюся от testing, и переключит нас на нее.
Как понятно из имени, subbranch_of_testing – это подветка ветки testing.
Как посмотреть ветки
Чтобы увидеть все созданные локально ветки, выполним команду:
$ git branch
Появится список веток. Текущая ветка будет выделена звездочкой.
Как переименовать ветку
Иногда оказывается, что первоначально созданное имя ветки не самое лучшее. Его можно изменить.
Локальную
Если еще не выполнена команда push, то достаточно переименовать локальную ветку.
Чтобы переименовать локальную ветку, выполним команду:
$ git branch -m <old-name> <new-name>
Например, переименуем ветку testing в ветку test:
$ git branch –m testing test
Чтобы переименовать текущую ветку, выполним команду:
$ git branch -m <new-name>
Например, текущая ветка у нас subbranch_of_testing. Переименуем ее в subbranch:
$ git branch –m subbranch
Удаленную
Переименовать удаленную ветку (ветку в удаленном репозитории) нельзя. Можно удалить ее и отправить в репозиторий локальную ветку с новым именем:
$ git push origin :old-name new-name
здесь origin — имя удаленного репозитория (обычно удаленный репозиторий так называется),
old-name — имя ветки локальной ветки,
new-name — новое имя ветки в удаленном репозитории.
Например, надо переименовать ветку testing в test:
$ git push origin :testing test
Удаление локальной ветки
Чтобы удалить локальную ветку, выполните одну из команд:
$ git branch -d branch_name $ git branch -D branch_name
Флаги:
-D сокращение для —delete –force удаляет ветку независимо от того, слиты ли ее изменения
-d сокращение для —delete
Например, удалим локальную ветку test:
$ git branch –d test
Вообще-то локальную ветку обычно удаляют после того, как слили ее (выполнили merge) в ветку master, смотрите последний раздел в статье о слиянии веток.
Удаление ветки из удаленного репозитория
Чтобы удалить удаленную ветку, можно использовать две записи.
Либо через двоеточие, как мы уже делали при переименовании ветки:
$ git push origin :branch_name
Например, удалим ветку test из удаленного репозитория origin:
$ git push origin :test
Либо с флагом —delete, так понятнее:
$ git push origin --delete test
здесь origin — имя удаленного репозитория
Как слить ветки
Обычно сливают некоторую ветку (например, ветку-багфикс) в ветку master. Для этого сначала перейдем в ветку master (в ту ветку, в которую вливаем изменения):
$ git checkout master
А затем выполним слияние. Допустим, в ветку master надо слить ветку test :
$ git merge test
Слияние веток не всегда происходит гладко, иногда требуется разрешить конфликты вручную. Для этого надо отредактировать конфликтые файлы, выполнить их commit.
Итог
В этой статье мы рассмотрели работу с ветками GIT и составили небольшую шпаргалку по использованию веток.