====== Работа с ветками в 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.