Перейти к содержимому

Прохождение Learn Git Branching: все уровни с объяснениями

Опубликовано22.09.2026
Обновлено22.09.2026
Просмотры1 113
Время чтения13 мин.
Оглавление статьи
В Learn Git Branching нужно привести граф коммитов к целевой схеме, учитывая расположение веток и указателя HEAD. Решение зависит не только от набора команд, но и от порядка их выполнения и выбранной ветки. Слияние через merge и перенос коммитов с помощью rebase по-разному меняют историю, а cherry-pick позволяет выбрать отдельные коммиты. Базовые задания посвящены созданию коммитов и ветвлению; более сложные — отмене изменений, переписыванию истории и работе с удалённым репозиторием.
Прохождение Learn Git Branching: все уровни с объяснениями

Learn Git Branching — интерактивный тренажёр, который показывает дерево Git после каждой команды. В актуальной версии есть 34 задания: 18 в разделе Main и 16 в Remote. Ниже — прохождение всех уровней с командами и коротким объяснением, зачем они нужны.

Эта шпаргалка полезнее, если сначала попробовать уровень самостоятельно. В Learn Git Branching одна и та же цель иногда достигается несколькими способами, поэтому здесь приведён один понятный вариант решения. Для интерактивного rebase -i отдельно указано, что делать в диалоге.

Не переносите всё из тренажёра в терминал буквально. Learn Git Branching — симулятор Git. Команды git fakeTeamwork, undo, level-команда reset и некоторые учебные флаги относятся к самому тренажёру. Кроме того, в remote-уроках его git clone намеренно создаёт учебный remote из текущего репозитория — в реальном Git git clone URL, наоборот, создаёт локальную копию существующего удалённого репозитория.

Что такое Learn Git Branching и как им пользоваться

Learn Git Branching — браузерный визуализатор Git, sandbox и набор уроков. Команда вводится в терминал, после чего рядом меняется граф commits и branches. Русский интерфейс доступен прямо в приложении.

Полезные команды самого тренажёра:

Команда

Что делает

Это реальный Git?

levels

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

Нет

show commands

Показывает поддерживаемые команды симулятора

Нет

undo

Отменяет последнюю команду в симуляторе

Нет

reset

Сбрасывает текущий уровень

Нет; не путать с git reset

git fakeTeamwork

Имитирует коммиты коллеги на remote

Нет

git commit, git rebase, git push

Учебная модель реальных Git-команд

Да, но симулятор упрощает детали

Если запутались, сравнивайте не номера C1, C2 сами по себе, а структуру графа: где находится HEAD, на какой commit указывает branch и кто является parent нужного commit.

В настоящем Git идентификаторы commits — длинные hashes, а не удобные C1 и C2. Learn Git Branching специально сокращает модель, чтобы отработать связи между commits и refs.

Main 1. Introduction Sequence

1.1 Introduction to Git Commits

git commit
git commit

Нужно сделать два новых commit. В тренажёре сообщения не обязательны; в реальном репозитории обычный workflow — git commit -m "message" либо commit через editor.

1.2 Branching in Git

git branch bugFix
git checkout bugFix

git branch создаёт указатель bugFix на текущий commit, а checkout переводит HEAD на эту branch. Короткий вариант в тренажёре:

git checkout -b bugFix

В современном реальном Git для работы именно с branches часто удобнее git switch -c bugFix, но Learn Git Branching исторически обучает через git checkout, поэтому в решениях оставляем его синтаксис.

1.3 Merging in Git

git checkout -b bugFix
git commit
git checkout main
git commit
git merge bugFix

Branches расходятся, после чего git merge bugFix объединяет историю с текущей main. В данном графе возникает merge commit с двумя parents.

1.4 Rebase Introduction

git checkout -b bugFix
git commit
git checkout main
git commit
git checkout bugFix
git rebase main

rebase переносит работу bugFix поверх актуального main, создавая новые commits с новыми идентификаторами. Это важно: rebase не «двигает тот же commit», а переписывает соответствующую часть истории.

Main 2. Ramping Up

2.1 Detach yo' HEAD

git checkout C4

Здесь HEAD должен указывать прямо на commit, а не на branch. Это состояние называется detached HEAD.

2.2 Relative Refs (^)

git checkout bugFix^

^ означает первого parent указанного commit. Вместо запоминания hash можно сказать «parent ветки bugFix».

2.3 Relative Refs #2 (~)

git checkout HEAD~1
git branch -f main C6
git branch -f bugFix HEAD~1

~N поднимается на N первых parents, а git branch -f NAME REF принудительно переставляет указатель branch. Именно запрос git branch -f встречается в семантике этой статьи: -f здесь означает force — разрешить перенести уже существующую branch на другой commit.

В реальном репозитории git branch -f и особенно git reset --hard меняют refs и могут сделать часть работы недоступной из обычной истории. Перед экспериментами вне тренажёра проверяйте git status и помните про git reflog.

2.4 Reversing Changes in Git

git reset local^
git checkout pushed
git revert pushed

Смысл задания — увидеть различие:

  • reset двигает local branch назад и переписывает видимую историю;

  • revert создаёт новый commit с обратными изменениями, поэтому подходит для уже опубликованной истории.

Main 3. Moving Work Around

3.1 Cherry-pick Intro

git cherry-pick C3 C4 C7

cherry-pick копирует изменения выбранных commits поверх текущего HEAD. Новые commits получают другие identifiers.

После тренажёра можно посмотреть более практические сценарии в материале ResizeWeb про cherry-pick, interactive rebase и восстановление истории Git.

3.2 Interactive Rebase Intro

git rebase -i HEAD~4

В открывшемся окне переставьте commits в порядок, показанный goal-графом: C3, C5, C4, а лишний C2 исключите. Learn Git Branching показывает собственный диалог; в настоящем Git rebase -i обычно открывает todo-list в text editor.

Учебный флаг --aboveAll, который Learn Git Branching использует в некоторых демонстрациях, не является типичной командой реального Git. Для прохождения текущего задания достаточно обычного git rebase -i HEAD~4 и действий в UI тренажёра.

Main 4. A Mixed Bag

4.1 Grabbing Just 1 Commit

git checkout main
git cherry-pick C4

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

4.2 Juggling Commits

git rebase -i HEAD~2
git commit --amend
git rebase -i HEAD~2
git branch -f main HEAD

Первым interactive rebase поднимите commit, который нужно исправить, на вершину. Затем --amend заменит последний commit его исправленной версией. Вторым rebase верните commits в требуемый порядок, а в конце переставьте main на результат.

4.3 Juggling Commits #2

git checkout main
git cherry-pick C2
git commit --amend
git cherry-pick C3

Та же цель достигается без двух interactive rebase: сначала копируем нужный commit, исправляем его, затем возвращаем следующий.

4.4 Git Tags

git tag v0 C1
git tag v1 C2
git checkout v1

Tags — постоянные имена для конкретных точек истории. В отличие от branch, tag сам по себе не перемещается при новых commits.

4.5 Git Describe

Сначала можно поэкспериментировать:

git describe main
git describe side
git describe bugFix

Для завершения уровня:

git commit

git describe описывает commit относительно ближайшего достижимого tag. Типичный вывод имеет форму tag-N-gHASH.

Main 5. Advanced Topics

5.1 Rebasing over 9000 times

git rebase main bugFix
git rebase bugFix side
git rebase side another
git rebase another main

Здесь удобно запомнить расширенную форму git rebase <base> <branch>: Git может rebase не только текущую branch, но и указанную явно.

5.2 Multiple parents

git branch bugWork HEAD~^2~

После merge commit у ^ появляется особенно полезная форма: ^2 означает второго parent. Модификаторы можно цеплять: HEAD~^2~ — последовательный маршрут по графу, а не арифметика над номерами commits.

5.3 Branch Spaghetti

git checkout one
git cherry-pick C4 C3 C2
git checkout two
git cherry-pick C5 C4 C3 C2
git branch -f three C2

Задание проверяет, умеете ли вы читать target-граф и собирать разные ветки из одних и тех же исходных commits в разном порядке.

Перед Remote: три отличия тренажёра от реального Git

В Learn Git Branching

В обычном Git

git clone в начале remote-секции создаёт учебный remote из текущего состояния

git clone URL создаёт локальный repository из существующего remote

Remote-tracking branch показывается как o/main

Обычно это origin/main; origin — стандартное имя remote после clone

git fakeTeamwork создаёт воображаемые commits коллеги

Такой команды Git нет; в жизни эти commits появляются после push других участников

Официальная документация тренажёра прямо говорит, что короткое o/ используется ради интерфейса, хотя в реальном Git remote обычно называется origin.

Remote 1. Push & Pull — Git Remotes!

1.1 Clone Intro

git clone

Это учебная команда подготовки remote. Её поведение здесь специально отличается от реального git clone URL.

1.2 Remote Branches

git commit
git checkout o/main
git commit

o/main — local remote-tracking ref: снимок положения remote main на момент последней синхронизации. Checkout такого ref переводит тренажёр в detached HEAD; новый commit не двигает o/main.

1.3 Git Fetchin'

git fetch

fetch получает недостающие objects и обновляет remote-tracking refs, но не merge'ит их в вашу текущую local branch.

1.4 Git Pullin'

git pull

В обычном default-сценарии pull выполняет fetch и затем интегрирует полученную историю — чаще merge, либо rebase при соответствующей настройке/флаге.

1.5 Faking Teamwork

git clone
git fakeTeamwork 2
git commit
git pull

git fakeTeamwork 2 существует только в Learn Git Branching и имитирует два commits другого участника.

1.6 Git Pushin'

git commit
git commit
git push

Два local commits создаются и затем публикуются на remote.

1.7 Diverged History

git clone
git fakeTeamwork
git commit
git pull --rebase
git push

Local и remote история расходятся. pull --rebase сначала получает remote commit, затем переигрывает local work поверх него, после чего push становится fast-forward.

1.8 Locked Main

git reset --hard o/main
git checkout -b feature C2
git push origin feature

Прямая отправка в protected main запрещена, поэтому work переносится в feature. В реальной команде следующим шагом обычно был бы pull/merge request на GitHub, GitLab или GitFlic.

Remote 2. To Origin And Beyond

2.1 Push Main!

git fetch
git rebase o/main side1
git rebase side1 side2
git rebase side2 side3
git rebase side3 main
git push

Сначала синхронизируем представление remote, затем последовательно укладываем feature branches друг на друга и двигаем main на вершину.

2.2 Merging with remotes

git checkout main
git pull
git merge side1
git merge side2
git merge side3
git push

Это альтернативная стратегия той же задачи: сохраняем merge history вместо линейной rebase-history.

Нет универсального правила «merge всегда лучше» или «rebase всегда лучше». Rebase переписывает commits и делает историю линейнее; merge сохраняет линии разработки и создаёт merge commits. Политика зависит от workflow команды.

2.3 Remote Tracking

git checkout -b side o/main
git commit
git pull --rebase
git push

Созданная от o/main branch получает upstream relationship. Благодаря этому команды pull и push могут вывести remote и target из настроек branch.

2.4 Git push arguments

git push origin main
git push origin foo

Здесь явно задаются remote и branch. Текущее положение HEAD при таком push не является источником выбора target.

2.5 Git push arguments — Expanded!

git push origin foo:main
git push origin main^:foo

Форма <source>:<destination> — refspec. Слева локальный ref/commit, справа branch на remote.

2.6 Fetch arguments

git fetch origin foo:main
git fetch origin main^:foo
git checkout foo
git merge main

У fetch направление refspec концептуально обратное push: source ищется на remote, destination создаётся или обновляется локально. Сам Learn Git Branching предупреждает, что прямой fetch в local branches — необычный production-workflow и используется здесь прежде всего для понимания refspec.

2.7 Source of nothing

git push origin :foo
git fetch origin :bar

Пустая сторона refspec демонстрирует крайние случаи синтаксиса. git push origin :foo удаляет remote branch foo. В реальной работе читаемее обычно:

git push origin --delete foo

Вторая команда используется тренажёром, чтобы показать необычную семантику пустого source для fetch. Для повседневного создания local branch используйте обычный git branch или git switch -c.

2.8 Pull arguments

git pull origin bar:foo
git pull origin main:side

Здесь pull объединяет две идеи: сначала выполняет fetch с указанным refspec, затем интегрирует получившийся destination в текущую branch.

Какие команды из прохождения особенно важно перепроверить в реальном Git

Из тренажёра

Что помнить в настоящем репозитории

git checkout

Работает, но для branches современн