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: удаляет указанную ветку.