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