
Статья Яна Уитлока о том, почему он не может отказаться от Magit, вдохновила меня поделиться своим взглядом на Magit. Этот текст посвящён перебазированию.
Ваш командный центр — git log
Я открыл лог Git1. Вызвал Magit, привязанный к F3, и нажал lL. Первая l включает работу с логом, вторая — показывает его для всех локальных и отслеживаемых ими удалённых веток.

Если захочется выполнить команду лога посложнее, в Magit это сделать очень просто. Нажимаем первую l, чуть задерживаемся — и Magit показывает ненавязчивые подсказки с доступными опциями:

Это означает, что не нужно запоминать опции — если они понадобятся, Magit напомнит о них. Несколько примеров:
Чтобы ограничить вывод конкретным автором, набираем
-A— и Magit показывает список всех авторов репозитория с нечётким поиском. Можно пролистать его или начать вводить имя нужного автора и подтвердить его нажатием Enter.Чтобы ограничить диапазон дат в логе, набираем
=u— Magit открывает календарь для выбора или ввода даты.Нужен вид без слияний, цветной и с прочим оформлением. В этой конфигурации он уже включен по умолчанию — флаги подсвечены и выделены жирным шрифтом.
Чтобы увидеть статистику изменений файлов, набираем
-s.А ещё нас интересуют только файлы в
tests, поэтому набираем--, чтобы ограничиться файлами, вводимtestsи подтверждаем нажатием Enter.
С такой конфигурацией мы должны просмотреть все ветки, включая удалённые. Получаем нужный вид, наконец нажав b.
Для Git это очень просто найти! Я всегда был тем самым человеком из git.txt, но даже меня Magit ещё учит новым трюкам. При этом их не только легко найти. Они быстрые. Вот полная последовательность нажатий клавиш (␍ — подтверждение через Enter):
l-Akqr␍=u2025-06-01␍-s--tests␍b
Выглядит сложно, но вспомните, как мы её строили: смотрели на подсказки и выбирали по одной опции. Если такой лог будет работать часто, вскоре можно будет набирать последовательность, даже не глядя на подсказки. Это легко и эффективно.
Соответствующая команда в терминале выглядела бы так:
$ git log --branches --remote --author=kqr --until=2025-06-01 \ --graph --color --decorate --no-merges --stat -- tests
Откуда я знаю? Это прямо указано в подсказках Magit! Если бы Magit не показал мне команду, много времени пришлось бы потратить на переключение между man`ом и командной строкой.
Люди беспокоятся, что интерактивные интерфейсы Git отучат их работать с командной строкой. С Magit этого не происходит. Он полностью прозрачен и поощряет понимание того, какие команды он выполняет под капотом.
Возможно, это кажется излишним увлечением логом в статье, посвящённой перебазированию, но на то есть причина: лог — это то, как мы понимаем структуру репозитория. А в Magit лог интерактивен.
Перебазирование из лога
Напомню, с чем мы работали:

Нужно перебазировать ветку profiling-of-test-suite поверх ветки optimise-company-name-generation. Текущая ветка — optimise, об этом говорит синяя рамка.
Мы поместили текстовый курсор на ветку profiling (она выделена серым), поэтому можем переключиться на неё, нажав bb␍. Первая b означает переключение (checkout), вторая b — выбор ветки, а список с нечётким поиском по умолчанию предложит ветку под курсором в виде лога. После этого рамка прыгнет на ветку profiling, показывая, что мы на ней.
Затем перемещаем курсор вверх, к optimise, и нажимаем re␍. r — для перебазирования, e — для перемещения в другое место, то есть не поверх вышестоящей ветки. Список с нечётким поиском снова по умолчанию предложит коммит под курсором в представлении лога, поэтому подтверждаем нажатием Enter.
Напомню: если не уверены, можно нажать только первую букву, и Magit покажет подсказки (например, добавление
-iсделает перебазирование интерактивным).
И всё! Лог обновляется и показывает ветку profiling, расположенную поверх optimise.
При более сложном интерактивном перебазировании мы получаем редактируемый список коммитов с удобными горячими клавишами: k — сброс, f — слияние без сообщения, w — переформулировка, s — сжатие и так далее
Список поддерживаемых операций также отображается под списком коммитов, если мы забыли доступные опции. Например, я почти никогда не создаю новые коммиты при перебазировании и не создаю коммитов слияния. Но при желании это возможно.
Что произошло?
Если хочется узнать, какие команды выполнил Magit, нажимаем $ и получаем лог команд Magit, где перечислены все выполненные команды Git.
В данном случае там будет:
git checkout profiling-of-test-suite git rebase --autostash optimise-company-name-generation
… хм, что такое --autostash и почему Magit использует его по умолчанию? Посмотрим в man git-rebase:
--autostashАвтоматически создаёт временную запись в stash [заначку] перед началом операции и применяет её после завершения. Это позволяет выполнять перебазирование с «грязным» рабочим деревом. Однако используйте с осторожностью: финальное применение stash после успешного перебазирования может привести к конфликтам.
Да, это действительно разумно делать по умолчанию. Я часто перебазирую с несохранёнными изменениями, и удобно, что не нужно прятать их в stash вручную.
Вот так Magit снова помогает лучше освоить Git. Я бы не узнал о --autostash, если бы Magit не использовал его по умолчанию. Именно так я также узнал, что --force-with-lease строго лучше --force, хотя мало кто об этом знает.
Другие интерфейсы Git
Это была несложная операция. Её можно было выполнить через командную строку. На самом деле это тривиальн�� — мы только что увидели две команды, которые Magit выполнил под капотом. Но через интерактивное представление лога мы намного лучше понимаем, что команды делают. Освоившись с Magit, мы начнём выполнять команды сложнее, на которые без наглядного представления не решились бы.
Конечно, есть и другие графические интерфейсы к Git, и перебазирование можно выполнить через любой из них. Но тогда мы не узнали бы так много о Git.
Magit занимает идеальную позицию: по сути, это тонкая обёртка вокруг командной строки Git, и он этого не стесняется. При этом Magit дополняет командную строку интерактивностью, доступностью и эффективностью, которые трудно найти где‑то ещё.
Здесь виден лишь намёк на возможности — подождите, пока не поймёте, как легко Magit позволяет интерактивно индексировать, убирать из индекса, отменять, сбрасывать файлы, ханки2 или даже части ханков.
1 Извините за курсор мыши — это артефакт выделения области для скриншота.
2 Ханк (hunk) — то же, что патч в diff, блок изменений. — Прим. перев.
Я пишу об инструментах, методах и навыках, полезных для разработки программных продуктов. Подпишитесь, чтобы получать еженедельные сводки новых статей по электронной почте. Если не понравится — можно отписаться в любой момент.
