Прохождение 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? |
|---|---|---|
| Открывает список заданий | Нет |
| Показывает поддерживаемые команды симулятора | Нет |
| Отменяет последнюю команду в симуляторе | Нет |
| Сбрасывает текущий уровень | Нет; не путать с |
| Имитирует коммиты коллеги на remote | Нет |
| Учебная модель реальных 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 bugFixgit 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 bugFixBranches расходятся, после чего 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 mainrebase переносит работу 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 C7cherry-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 v1Tags — постоянные имена для конкретных точек истории. В отличие от branch, tag сам по себе не перемещается при новых commits.
4.5 Git Describe
Сначала можно поэкспериментировать:
git describe main
git describe side
git describe bugFixДля завершения уровня:
git commitgit 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 |
|---|---|
|
|
Remote-tracking branch показывается как | Обычно это |
| Такой команды 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 commito/main — local remote-tracking ref: снимок положения remote main на момент последней синхронизации. Checkout такого ref переводит тренажёр в detached HEAD; новый commit не двигает o/main.
1.3 Git Fetchin'
git fetchfetch получает недостающие 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 pullgit 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 pushLocal и 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
Из тренажёра | Что помнить в настоящем репозитории |
|---|---|
| Работает, но для branches современн |