Изучите 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, добавив в него цитату. Вы можете написать что-то подобное:
     
    Это цитата, и она мне нравится.
    Цитата: искусство цитирования
  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 командой push. В этом примере рассматриваются некоторые основы создания веток и работы с ветками, созданными другими участниками.

  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, вам также нужно добавить проверяющих из числа участников команды. Подробнее о запросах 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. Переключитесь на главную ветку командой команду git checkout master. Результат должен выглядеть примерно так:
     git checkout master Switched to branch 'master' Your branch is up-to-date with 'origin/master'.
    Обратите внимание: в сообщении указано, что ветка находится в актуальном состоянии. Это относится только к локальной ветке. Мы знаем это, поскольку только что слили изменение в главную ветку, но не извлекли его командой pull из удаленного репозитория в локальную систему. Мы сделаем это на следующем шаге.
  3. Выполните команду git pull. Результат должен выглядеть примерно так:
     $ git pull remote: Counting objects: 1, done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), 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(-)
    Дело в том, что когда вы извлекаете изменения из удаленного репозитория, система 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. Слейте главную ветку в свою рабочую ветку с помощью команды 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. Завершив работу, отправьте коммиты, чтобы обновить функциональную ветку в Bitbucket.

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

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

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

На этом этапе коллеги комментируют и утверждают отправленные коммиты. Исправьте функцию по их отзывам локально, а затем сделайте коммит и отправьте изменения в Bitbucket. Обновления отобразятся в запросе pull.

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

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

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