Изучите Git с помощью Bitbucket Cloud

Изучите ветвление с помощью Bitbucket Cloud

Цель

Это обучающее руководство научит вас основным приемам создания, просмотра и объединения веток, а также работы в них с помощью Git и Bitbucket Cloud. 

Время Аудитория Обязательные условия
35 минут Требуется понимать основы рабочего процесса Git Необходимо установить Git
    Требуется аккаунт Bitbucket

Это учебное руководство подходит для тех, кто уже знаком с основами рабочего процесса Git, в том числе со следующими понятиями.

  • Клонирование: копирование удаленного репозитория из Bitbucket Cloud в локальную систему.
  • Добавление или индексирование: принятие внесенных изменений и их подготовка к добавлению в историю Git.
  • Создание коммита: добавление новых или измененных файлов в историю Git для репозитория.
  • Операция pull: добавление в локальный репозиторий новых изменений, внесенных другими разработчиками.
  • Операция push: отправка изменений из локальной системы в удаленный репозиторий. 

Если вы не знаете основ Git, ознакомьтесь с обучающим руководством Изучение Git с помощью Bitbucket Cloud, и вы быстро войдете в курс дела.

Для чего нужно ветвление

Ветвление — один из лучших способов реализации максимально эффективного управления версиями в Git. Ветвление в Git обеспечивает следующие возможности.

  • Работа в одном репозитории нескольким командам одновременно.
  • Совместная работа в Bitbucket Cloud с привлечением участников команды из любого уголка мира.
  • Разработка одновременно во множестве независимых направлений без заморозки кода.

Настройка

Чтобы у вас было ощущение командной работы в общем репозитории Bitbucket, мы предоставляем вам форк нашего общедоступного репозитория.

Что такое форк?

Форк — это альтернативный способ сохранить клон или копию. Термин форк (в программировании) происходит от одноименного системного вызова в Unix, который создает копию существующего процесса. Таким образом, форк, в отличие от ветки, не зависит от исходного репозитория. Если исходный репозиторий удален, форк остается. Если вы делаете форк репозитория, вы получаете этот репозиторий вместе со всеми его ветками. 

  1. Перейдите по ссылке tutorials/tutorials.git.bitbucket.org.
  2. Нажмите на левой боковой панели значок + > Fork this repository (Сделать форк этого репозитория).
  3. Измените Name (Имя) на уникальное для вашей команды имя репозитория и нажмите Fork repository (Сделать форк репозитория)
  4. Создайте для репозитория каталог, в который будет легко переходить. У вас должно получиться что-то подобное:
    $ mkdir test-repositories
    $ cd test-repositories/
    $ test-repositories
    В предыдущем примере мы создали каталог test-repositories с помощью команды mkdir (make directory — создать каталог) и перешли в этот каталог с помощью команды cd (change directory — сменить каталог).
  5. Клонируйте репозиторий, для которого был сделан форк, в только что созданный каталог. Это должно выглядеть примерно так:
    $ git clone https://dstevenstest@bitbucket.org/dstevenstest/mygittutorial.bitbucket.io.git
        Cloning into 'mygittutorial.bitbucket.io'...
        remote: Counting objects: 12392, done.
        remote: Compressing objects: 100% (12030/12030), done.
        remote: Total 12392 (delta 8044), reused 564 (delta 360)
        Receiving objects: 100% (12392/12392), 2.72 MiB | 701.00 KiB/s, done.
        Resolving deltas: 100% (8044/8044), done.
    $ cd mygittutorial.bitbucket.io/
    В этом примере репозиторий клонируется с помощью команды git clone и во время клонирования создается каталог mygittutorial.git.bitbucket.io

Создание ветки и внесение изменений с помощью процесса ветвления

Добавьте с помощью этой ветки цитату на ваш веб-сайт. 

  1. Создайте ветку с помощью команды git branch. 
    $ git branch test-1
  2. Переключитесь на только что созданную ветку с помощью команды git checkout.
    $ git checkout test-1
    Switched to branch 'test-1'
  3. Просмотрите список локальных веток с помощью команды git branch.
    $ git branch
      master
      * test-1
  4. Обновите файл editme.html, добавив в него цитату. Вы можете написать что-то подобное: 
    <div class="quote">
      <blockquote>Это цитата, и она мне нравится.</blockquote>
      <cite>Цитата: искусство цитирования</cite>
    </div>
  5. Добавьте изменение.
    git add editme.html
    Примечание. Ваше изменение пока не отправлено в историю Git, оно находится в состоянии «ожидания». Мы рассматривали эту тему в разделе Сохранение изменений.
  6. Выполните коммит изменения и добавьте к нему описательный комментарий.
    git commit editme.html -m 'added a new quote'
    [test-1 063b772] added a new quote
    1 file changed, 3 insertions(+), 3 deletions(-)
    Примечание. Теперь изменение добавлено в историю Git в виде отдельного коммита. Мы рассматривали эту тему в разделе Сохранение изменений.
  7. Отправьте это изменение в Bitbucket с помощью команды git push.
    git push
    fatal: The current branch test-1 has no upstream branch.
    To push the current branch and set the remote as upstream, use
      git push --set-upstream origin test-1
    Вы увидите ошибку, так как при первой отправке новой ветки, созданной локально, необходимо назначить эту ветку.
  8. Отправьте ветку и изменение с помощью команды git push.
    $ git push origin test-1
    Counting objects: 3, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (3/3), done.
    Writing objects: 100% (3/3), 363 bytes | 0 bytes/s, done.
    Total 3 (delta 2), reused 0 (delta 0)
    remote:
    remote: Create pull request for test-1:
    remote: https://bitbucket.org/dstevenstest/dans.git.bitbucket.org/pull-requests/new?source=test-1&t=1
    remote:
    To https://bitbucket.org/dstevenstest/dans.git.bitbucket.org.git
    * [new branch] test-1 -> test-1
    Эта команда говорит системе, что репозиторий origin является репозиторием назначения для этой новой ветки.
  9. Откройте учебный репозиторий и нажмите Branches (Ветки). Вы должны увидеть обе ветки: ветку master и ветку test-1. Это должно выглядеть примерно так:
Изучите ветки в Bitbucket

Создание и извлечение удаленной ветки, переключение на удаленную ветку

При работе в команде вам, скорее всего, придется получать ветки, созданные другими участниками команды, с помощью команд pull или fetch, а также отправлять их в Bitbucket. В этом примере рассматриваются некоторые основы по созданию веток и работе с ветками, созданными другими участниками.

  1. Перейдите в учебный репозиторий в Bitbucket и нажмите Branches (Ветки). Вы должны увидеть что-то подобное: Branches
  2. Нажмите Create branch (Создать ветку), дайте этой ветке имя test-2 и нажмите Create (Создать). 
  3. Скопируйте команду git fetch в диалоговое окно переключения веток. Это должно выглядеть примерно так:
    $ git fetch && git checkout test-2
    From https://bitbucket.org/dstevenstest/dans.git.bitbucket.org
    * [new branch] test-2 -> origin/test-2
    Branch test-2 set up to track remote branch test-2 from origin.
    Switched to a new branch 'test-2'
  4. В терминале запустите команду git branch. Перед вами должен появиться примерно такой список веток:
    $ git branch
      master
      test-1
    * test-2
    Ветка, отмеченная звездочкой (*), является активной. В любом рабочем процессе с ветвлениями важно помнить, с какой веткой вы работаете. 
  5. Выполните команду git status. Вы увидите что-то подобное:
    $ git status
    On branch test-2
    Your branch is up-to-date with 'origin/test-2'.
    nothing to commit, working tree clean
    Вы можете видеть, с какой веткой вы работаете и соответствует ли в настоящий момент состояние этой ветки состоянию удаленной ветки (origin). 
  6. Для переключения на другую ветку используйте команду git checkout. Эта команда будет выглядеть примерно так:
    $ git checkout test-1
    Switched to branch 'test-1'
    Your branch is ahead of 'origin/test-1' by 3 commits.
    (use "git push" to publish your local commits)
    Самое важное правило, которое нужно помнить при работе с ветками: проверяйте, что вы вносите изменения в нужную ветку. 

Отправка изменений и создание запроса pull

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

  1. Нажмите +> Create a pull request (Создать запрос pull). Вы увидите, что ветка test-1  указана как источник, а ветка master — как целевая ветка. 

    Так как этот репозиторий создан с помощью ответвления (форка) существующего репозитория, в качестве ветки назначения указана главная ветка master репозитория, к которому мы применяли команду ответвления.

    Чтобы исправить это, вам необходимо изменить ветку назначения (ветку, куда будет выполнено слияние ваших изменений) с tutorials/tutorials.git.bitbucket.org на ваш репозиторий.

    Pull Request

    Чтобы отправить запрос pull, вам также необходимо добавить проверяющих из числа участников команды. Подробнее о запросах pull

  2. Нажмите Create pull request (Создать запрос pull).
  3. Добавьте в запрос pull комментарий, выбрав строку в области Diff (Сравнение) (область, в которой отображается изменение, которое вы внесли в файл editme.html).
  4. Нажмите Approve (Подтвердить) в верхнем левом углу страницы. Безусловно, в реальном запросе pull у вас будут комментарии от проверяющих
  5. Нажмите Merge (Выполнить слияние)
  6. (Необязательно.) Добавьте в Commit message (Комментарий к коммиту) дополнительные сведения.
  7. Выберите для операции слияния коммита одну из двух возможных стратегий:
    • Merge commit (Слияние коммита): сохраняет все коммиты из исходной ветки и делает их частью ветки назначения. Этот вариант аналогичен выполнению команды git merge --no-ff в командной строке.
    • Squash (Склеить): во время слияния исходной ветки в ветку назначения ваши коммиты будут склеены. Этот параметр аналогичен выполнению команды git merge --squash в командной строке.
    Подробнее об этих двух стратегиях слияния.
  8. Нажмите Commits (Коммиты) — и вы увидите, как ваша ветка встраивается в более крупную схему изменений.

Удаление ветки и получение данных с помощью команды pull из главной ветки (master) в локальную рабочую ветку

Итак, вы прошли через основной рабочий процесс ветвления, и изменения теперь находятся в главной ветке. Напоследок рассмотрим, как удалить ветку, для которой только что выполнено слияние, выполнить запрос pull к главной ветке, а затем слить обновленную главную ветку с веткой test-2.

Зачем удалять ветку?

Помните, что ветвление в Git отличается от ветвления в SVN или аналогичных системах управления версиями тем, что в нем используются как долгосрочные ветки (главная ветка, ветка разработки), так и временные ветки (наподобие тех, что мы приводим в примерах в этом обучающем руководстве). Поэтому рекомендуется удалять ветки, созданные локально, чтобы поддерживать чистоту локальной среды.

Для чего выполнять запрос pull из главной ветки и выполнять слияние результата с веткой test-2?

Это пример того, как следует работать с репозиторием, в котором работает другой участник. Рекомендуется время от времени запрашивать данные с помощью команды pull и сливать их со своей рабочей веткой, чтобы избежать конфликтов слияния при запросах pull.

  1. Откройте терминал и запустите команду git status. Результат должен выглядеть примерно так:
    $ git status
    On branch test-1
    nothing to commit, working tree clean
    Как видно, мы находимся в ветке, где чуть раньше вносили изменения, и сейчас в ней изменений нет. Теперь, когда мы закончили работу, эту ветку можно удалить.
  2. Перейдите в главную ветку master, запустив команду git checkout master. Результат должен выглядеть примерно так:
    git checkout master
    Switched to branch 'master'
    Your branch is up-to-date with 'origin/master'.
    Обратите внимание, что в сообщении указано, что ветка находится в актуальном состоянии. Это относится только к локальной ветке. Мы знаем это, поскольку только что слили изменение в главную ветку master, но не выполнили pull этого изменения из удаленного репозитория в нашу локальную систему. Мы сделаем это на следующем шаге.
  3. Запустите команду git pull. Результат должен выглядеть примерно так:
    $ git pull
    remote: Counting objects: 1, done.
    remote: Total 1 (delta 0), reused 0 (delta 0)
    Unpacking objects: 100% (1/1), done.
    From https://bitbucket.org/dstevenstest/dans.git.bitbucket.org
    2d4c0ab..dd424cb master -> origin/master
    Updating 2d4c0ab..dd424cb
    Fast-forward
    editme.html | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)
    Дело в том, что когда вы делаете pull изменений из удаленного репозитория, система Git запускает ускоренное слияние, чтобы интегрировать внесенные изменения. Она также указывает количество файлов и строк, в которых были сделаны изменения.
  4. Запустите команду git branch -d {имя_ветки}, чтобы удалить ветку test-1. Результат должен выглядеть примерно так:
    $ git branch -d test-1
    Deleted branch test-1 (was 063b772)
    Как видно, команда удалила ветку, и эта ветка содержала указанный хеш последнего коммита. Это безопасный способ удаления ветки: система Git не позволила бы удалить ее, если бы в этой ветке были изменения, ожидающие коммита. Однако это не помешает удалить изменения, коммит которых в истории Git был выполнен, однако они не были слиты в другую ветку.
  5. Переключитесь на ветку test-2 с помощью команды git checkout.
    $ git checkout test-2
    Switched to branch 'test-2'
    Your branch is up-to-date with 'origin/test-2'.
  6. Слейте главную ветку master в свою рабочую ветку с помощью команды git merge master test-2. Результат должен выглядеть примерно так:
    $ git merge master test-2
    Updating 2d4c0ab..dd424cb
    Fast-forward
    editme.html | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)
    Помните о следующем:
    • Очень важно, какая ветка активна. Если вы хотите слить ветку master в ветку test-2, вам необходимо переключиться на ветку test-2 (эта ветка должна быть активной). То же самое верно, если вы хотите слить ветку test-2 в ветку master: вы должны переключиться на ветку master.
    • Для того чтобы в любой момент узнать, какая ветка активна, используйте команду git branch (активная ветка будет отмечена звездочкой), а с помощью команды git status можно узнать, на какой ветке вы находитесь и есть ли в ней ожидающие локальные изменения.

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

Знакомство с процессом ветвления

Рабочий процесс с функциональными ветками Git является эффективным способом командной работы в Bitbucket. В этом рабочем процессе разработка функциональных возможностей выполняется в ветках, которые отделены от главной ветки (master). Это позволяет множеству разработчиков работать над своими задачами, не затрагивая основной код.

Начните с главной ветки

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

Создайте новую ветку

Используйте отдельную ветку для каждой разрабатываемой возможности или задачи. После создания ветки войдите в нее локально, чтобы любые внесенные вами изменения находились именно в этой ветке.

Вносите изменения, добавляйте их к ветке, делайте коммиты и публикуйте

Работайте над задачей и выполняйте коммиты, как при обычной работе с Git. Когда все будет готово, опубликуйте коммиты с помощью команды push, обновив функциональную ветку в Bitbucket.

Отправьте код на проверку

Чтобы получить отзыв на свой код, создайте в Bitbucket запрос pull. В нем можно добавить проверяющих и убедиться, что все работает, как нужно, прежде чем выполнять слияние. 

Исправьте функциональный код по итогам отзывов

Участники команды прокомментируют и подтвердят ветку. Исправьте код локально на основе полученных комментариев, выполните коммит и отправьте изменения в Bitbucket. Ваши обновления появятся в запросе pull.

Выполните слияние своей ветки

Если другие участники уже успели внести изменения в репозиторий, возможно, перед слиянием придется устранять конфликты слияния. Когда ваш запрос pull будет подтвержден, а все конфликты будут разрешены, вы сможете добавить код в основную ветку. Выполните слияние запроса pull в Bitbucket. 

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