Learn Git. Git Branching. Codecademy на русском
1. Git Branch
До этого момента Вы работали в единственной Git-ветке, которая называлась master
. Git позволяет нам создавать ветки, как эксперимент в версией проекта. Представьте, что вы хотите создать версию истории со счастливым концом. Вы можете создать новую ветку со счастливым концом, и все изменения находятся только в ветке. Она никак не влияет на master
до тех пор, пока вы не захотите слияния счастливого конца с веткой master.
В этом уроке мы будем использовать ветвление, чтобы разработать несколько версий резюме.
Вы можете использовать эту команду, чтобы найти ответ на вопрос: "На какой сейчас я ветке?": git branch
Инструкция
- Проверьте на какой ветке Вы сейчас находитесь. В выходных данных
*
(звёздочка) показывает, на какой ветке ты сейчас. Сейчас проект использует только одну ветку.
Нажмите Next, чтобы сделать новую ветку.
2. Branching Overview
Диаграмма справа иллюстрирует ветвление.
- Кружки - это коммиты, и вместе они формирует историю Git-проекта.
- Новая ветка - это другая версия Git-проекта. Он включает в себя и коммиты из Master, но и также коммиты, которые Master не имеет.
3. Git Branch 2
Прямо сейчас Git-проект имеет только одну ветку: master
.
Чтобы создать новую ветку, используйте команду git branch new_branch
Здесь new_branch
означает имя новой ветки, которую вы хотите сделать, как photos
или blurb
. Убедитесь, что название вашей ветки описывает цель вашей ветки. А также то, что имя ветки не должно содержать пробелов: new-branch
и new_branch
- это правильные имена веток, а вот new branch
- нет.
Инструкция
- Давайте сделаем новую версию нашего резюме для подачи на работу инструктором по фехтованием.
Назовите новую веткуfencing
.
Затем посмотрите ветки с помощью той команды, которую изучали в прошлом занятии.
Заметьте, что в терминале выведется две ветки:master
иfencing
.
4. Git Checkout
Отлично! Вы создали новую ветку.
Сейчас master
и fencing
ветки индентичны: они имеют одинаковую коммит-историю. Вы можете переключиться на новую ветку с помощью команды git checkout branch_name
Здесь branch_name
это имя ветки. Если имя ветки было б skill
, то команда выглядела бы так:git checkout skill
Как только вы переключились на другую ветку, вы можете делать коммиты, которые не будут влиять на master
.
Вы можете продолжать свой рабочий процесс, при этом master
остается нетронутым!
Инструкция
- Переключитесь из
master
на веткуfencing
. - Используйте команду
git branch
, чтобы проверить на какую ветку вы переключились
Заметьте, в выводе*
теперь находиться наfencing
ветке
5. Commit on a new branch
Наши поздравления! Вы переключились на новую ветку. Все команды, которые вы делали с master
, вы также можете делать с этой веткой.
Например, чтобы индексировать файл, используем: git add filename
, а чтобы закоммитить: git commit -m "Commit message"
Сейчас мы сделаем коммит на fencing
ветке. Справа, на схеме, показано, что будет с проектом после коммита.
Инструкция
- Посмотрите лог проекта
Обратите внимание на выходные данные:- Все коммиты, которые вы видите, сделаны в
master
.fencing
унаследовал их. - Это значит, что каждый коммит ветки
master
есть вfencing
q
, чтобы выйти. - Все коммиты, которые вы видите, сделаны в
- В resume.txt удалите строку
-Scheme against Captain Hook
и вставьте вместо неё:-Engage in swordfights with pirates
- Проиндексируйте resume.txt
- Сделайте коммит изменения с сообщением в репозиторий.
6. Git merge
Что если мы хотим включить все изменения, сделанные в fencing
в ветку master
? Мы легко может это сдедать слияние этих веток: git merge branch_name
Например, если мы хотим слить skills
в master, я введу: git merge skills
Сейчас мы сольём ветки. Имейте в виду:
- Ваша цель - это обновление
master
с изменениями, которые вы делали в веткеfencing
. fencing
является отдающей веткой, посколько она обеспечивает изменения.master
является получающей веткой, поскольку она принимает изменения.
Инструкция
- Сейчас вы на ветке
fencing
. Переключитесь наmaster
. - Через терминал слейте ветку
fencing
вmaster
.
Обратите внимание на выходные данные: слияние - это "быстрая перемотка вперед", потому что Git знает, чтоfencing
содержит самые недавние коммиты. Git перематывает вперед, чтобы сравнять сfencing
.
7. Merge conflict I
Слияние прошло успешно, потому что
master
не изменилось с тех пор, как мы сделал коммит на fencing
. Git знал, что просто обновил master
с изменениями ветки fencing
.
Что произойдет, если вы сделаете коммит в ветке master
перед тем, как вы объединили две ветви? Кроме того, что если коммит, который вы сделаете на master
, изменит тот же самый текст, с которым вы работали в fencing
? Когда мы переключимся назад на ветку master
и спросите git о слиянии двух веток, то Git не поймёт какое изменение он хочет сохранить. Это называется конфликт слияния.
Инструкция
- Сейчас вы на ветке
master
. В редакторе где написано-Engage in swordfights with pirates
добавьте слово "professional" так, чтобы текст выглядил так:-Engage in swordfights with professional pirates
. Нажмите Run. - Проиндексируйте файл resume.txt.
- Сделайте коммит изменений в репозиторий с сообщением.
- Представте, что прошло несколько недель, и вы захотели снова продолжить развивать резюме по фехтованию. Вернитесь снова в ветку
fencing
. - В ветке
fencing
поменяйте строку следующим образом:-Engage in swordfights with professional pirates such as Smee.
. Нажмите Run. - Теперь снова проиндексируйте файл resume.txt.
- Сделайте коммит изменений в репозиторий с сообщением.
8. Merge conflict II
Скажем, вы решили слить из ветки fencing
в master
.
Вот тут и начинается проблемы!
Вы сделали коммиты на отдельных ветках, которые разделяет одну и ту же строку в разные стороны. Сейчас, когда мы попытаемя слить fencing
в master
, Git не сможет понять, какую версию ему сохранять.
Инструкция
- Переключитесь на ветку
master
. - Через терминал введите команду:
git merge fencing
Это будет попытка слитьfencing
вmaster
. В результате терминал нам вернёт:CONFLICT (content): Merge conflict in resumé.txt Automatic merge failed; fix conflicts and then commit the result.
- Мы должны решить конфликт.
Посмотрите файл resume.txt в редакторе. Git использовал маркировкиHEAD
(master) версия файла иfencing
версию файла:[посмотрите третий пункт в инструкции]. Git как бы спрашивает нас, какую версию файла ему сохранить:master
(master) версияfencing
версию. Вы решили, что хотите сохранитьfencing
версию.
Через редактор:
удалите содержимое тех строк, которые выглядят как в веткеmaster
.
Удалите все специльные маркеры Git-а, включая словаHEAD
иfencing
. Если какие-либо маркеры Git-а, как, например, >>>>>>> and =======, остаются, то конфликт сохраняется.
Попробуйте перезагрузить страницу, если Git-маркеры не появились. - Проиндексируйте resume.txt.
- Теперь сделайте коммит. В качестве коммит-сообщения наберите "Resolve merge conflict" (разрешение конфликта слияния), для того, чтобы отметить цель данного коммита.
9. Delete Branch
Обычно, в Git-е ветки подразумевают конечную цель. Вы сделали их для разработки новой особенности (фичи) проекта и как только цель достигнута, ветка сливается в master
. После того, как ветка слилась в master
, она достигла цель и может быть удалена.
Команда git branch -d branch_name
удаляет выбранную ветку из Git-проекта.
Сейчас, master
содержит все файловые изменения из fencing
, давайте удалим fencing
.
Инструкция
- Удалите ветку
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: удаляет указанную ветку.