Blog logotype

Learn Git. Git Branching. Codecademy на русском

1. Git Branch

До этого момента Вы работали в единственной Git-ветке, которая называлась master. Git позволяет нам создавать ветки, как эксперимент в версией проекта. Представьте, что вы хотите создать версию истории со счастливым концом. Вы можете создать новую ветку со счастливым концом, и все изменения находятся только в ветке. Она никак не влияет на master до тех пор, пока вы не захотите слияния счастливого конца с веткой master.

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

Вы можете использовать эту команду, чтобы найти ответ на вопрос: "На какой сейчас я ветке?": git branch

Инструкция

  1. Проверьте на какой ветке Вы сейчас находитесь. В выходных данных * (звёздочка) показывает, на какой ветке ты сейчас. Сейчас проект использует только одну ветку.
    Нажмите Next, чтобы сделать новую ветку.

2. Branching Overview

Диаграмма справа иллюстрирует ветвление.

  • Кружки - это коммиты, и вместе они формирует историю Git-проекта.
  • Новая ветка - это другая версия Git-проекта. Он включает в себя и коммиты из Master, но и также коммиты, которые Master не имеет.

Нажмите Next чтобы сделать свою первую ветку.

3. Git Branch 2

Прямо сейчас Git-проект имеет только одну ветку: master.

Чтобы создать новую ветку, используйте команду git branch new_branch

Здесь new_branch означает имя новой ветки, которую вы хотите сделать, как photos или blurb. Убедитесь, что название вашей ветки описывает цель вашей ветки. А также то, что имя ветки не должно содержать пробелов: new-branch и new_branch - это правильные имена веток, а вот new branch - нет.

Инструкция

  1. Давайте сделаем новую версию нашего резюме для подачи на работу инструктором по фехтованием.
    Назовите новую ветку fencing.
    Затем посмотрите ветки с помощью той команды, которую изучали в прошлом занятии.
    Заметьте, что в терминале выведется две ветки:master и fencing.

4. Git Checkout

Отлично! Вы создали новую ветку.

Сейчас master и fencing ветки индентичны: они имеют одинаковую коммит-историю. Вы можете переключиться на новую ветку с помощью команды git checkout branch_name

Здесь branch_name это имя ветки. Если имя ветки было б skill, то команда выглядела бы так:
git checkout skill

Как только вы переключились на другую ветку, вы можете делать коммиты, которые не будут влиять на master.

Вы можете продолжать свой рабочий процесс, при этом master остается нетронутым!

Инструкция

  1. Переключитесь из master на ветку fencing.
  2. Используйте команду git branch, чтобы проверить на какую ветку вы переключились
    Заметьте, в выводе * теперь находиться на fencing ветке

5. Commit on a new branch

Наши поздравления! Вы переключились на новую ветку. Все команды, которые вы делали с master, вы также можете делать с этой веткой.

Например, чтобы индексировать файл, используем: git add filename, а чтобы закоммитить: git commit -m "Commit message"

Сейчас мы сделаем коммит на fencing ветке. Справа, на схеме, показано, что будет с проектом после коммита.

Инструкция

  1. Посмотрите лог проекта
    Обратите внимание на выходные данные:
    • Все коммиты, которые вы видите, сделаны в master. fencing унаследовал их.
    • Это значит, что каждый коммит ветки master есть в fencing
    Примечание: если курсор находиться в git log mode нажмите q, чтобы выйти.
  2. В resume.txt удалите строку -Scheme against Captain Hook и вставьте вместо неё: -Engage in swordfights with pirates
  3. Проиндексируйте resume.txt
  4. Сделайте коммит изменения с сообщением в репозиторий.

6. Git merge

Что если мы хотим включить все изменения, сделанные в fencing в ветку master? Мы легко может это сдедать слияние этих веток: git merge branch_name

Например, если мы хотим слить skills в master, я введу: git merge skills

Сейчас мы сольём ветки. Имейте в виду:

  • Ваша цель - это обновление master с изменениями, которые вы делали в ветке fencing.
  • fencing является отдающей веткой, посколько она обеспечивает изменения.
  • master является получающей веткой, поскольку она принимает изменения.

Инструкция

  1. Сейчас вы на ветке fencing. Переключитесь на master.
  2. Через терминал слейте ветку fencing в master.
    Обратите внимание на выходные данные: слияние - это "быстрая перемотка вперед", потому что Git знает, что fencing содержит самые недавние коммиты. Git перематывает вперед, чтобы сравнять с fencing.

7. Merge conflict I

Слияние прошло успешно, потому что master не изменилось с тех пор, как мы сделал коммит на fencing. Git знал, что просто обновил master с изменениями ветки fencing.

Что произойдет, если вы сделаете коммит в ветке master перед тем, как вы объединили две ветви? Кроме того, что если коммит, который вы сделаете на master, изменит тот же самый текст, с которым вы работали в fencing? Когда мы переключимся назад на ветку master и спросите git о слиянии двух веток, то Git не поймёт какое изменение он хочет сохранить. Это называется конфликт слияния.

Инструкция

  1. Сейчас вы на ветке master. В редакторе где написано -Engage in swordfights with pirates добавьте слово "professional" так, чтобы текст выглядил так: -Engage in swordfights with professional pirates. Нажмите Run.
  2. Проиндексируйте файл resume.txt.
  3. Сделайте коммит изменений в репозиторий с сообщением.
  4. Представте, что прошло несколько недель, и вы захотели снова продолжить развивать резюме по фехтованию. Вернитесь снова в ветку fencing.
  5. В ветке fencing поменяйте строку следующим образом: -Engage in swordfights with professional pirates such as Smee.. Нажмите Run.
  6. Теперь снова проиндексируйте файл resume.txt.
  7. Сделайте коммит изменений в репозиторий с сообщением.

8. Merge conflict II

Скажем, вы решили слить из ветки fencing в master.

Вот тут и начинается проблемы!

Вы сделали коммиты на отдельных ветках, которые разделяет одну и ту же строку в разные стороны. Сейчас, когда мы попытаемя слить fencing в master, Git не сможет понять, какую версию ему сохранять.

Инструкция

  1. Переключитесь на ветку master.
  2. Через терминал введите команду: git merge fencing
    Это будет попытка слить fencing в master. В результате терминал нам вернёт: CONFLICT (content): Merge conflict in resumé.txt Automatic merge failed; fix conflicts and then commit the result.
  3. Мы должны решить конфликт.
    Посмотрите файл resume.txt в редакторе. Git использовал маркировки HEAD(master) версия файла и fencing версию файла:[посмотрите третий пункт в инструкции]. Git как бы спрашивает нас, какую версию файла ему сохранить: master(master) версия fencing версию. Вы решили, что хотите сохранить fencing версию.
    Через редактор:
    удалите содержимое тех строк, которые выглядят как в ветке master.
    Удалите все специльные маркеры Git-а, включая слова HEAD и fencing. Если какие-либо маркеры Git-а, как, например, >>>>>>> and =======, остаются, то конфликт сохраняется.
    Попробуйте перезагрузить страницу, если Git-маркеры не появились.
  4. Проиндексируйте resume.txt.
  5. Теперь сделайте коммит. В качестве коммит-сообщения наберите "Resolve merge conflict" (разрешение конфликта слияния), для того, чтобы отметить цель данного коммита.

9. Delete Branch

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

Команда git branch -d branch_name удаляет выбранную ветку из Git-проекта.

Сейчас, master содержит все файловые изменения из fencing, давайте удалим fencing.

Инструкция

  1. Удалите ветку fencing
    Теперь проверьте, действительно ли fencing удалилась из списка веток нашего проекта.
    Заметьте, что в результате выйдет только одна ветка, master. Нажмите Next, чтобы продолжить.

Итоги

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

  • Ветвление в git позволяет пользователям экспериментировать с разными версиями проекта, проверяя отдельные ветки на работу в проекте.

Следующие команды полезны для работы с ветками:

  • git branch: список всех Git-веток.
  • git branch branch_name: создаёт новую ветку.
  • git checkout branch_name: используется для переключения с одной ветки на другую.
  • git merge branch_name: используется для присоединения изменений файла с одной ветки в другую.
  • git branch -d branch_name: удаляет указанную ветку.