Разработчик, который годами собирал коммиты мышью в графическом клиенте, при первом входе на сервер без рабочего стола теряет опору. Голый git status отвечает коротким списком, git add -p требует вспоминать однобуквенные подсказки, а разбор трёх десятков файлов растягивается на вечер. Lazygit закрывает этот пробел: полноэкранный интерфейс для терминала, написанный на Go и работающий поверх обычного git. Программа не ведёт собственной базы и не меняет формат истории: она вызывает знакомые команды git, поэтому репозиторий остаётся стандартным и открывается в любом другом клиенте без сюрпризов. Ниже - механика по шагам: устройство экрана, разбор правок по строкам, коммиты по частям файла, накопитель stash, ветки, переборка истории, конфликты и собственные команды.
Пять панелей интерфейса и полный обзор состояния репозитория на одном экране
Команда lazygit, запущенная в каталоге репозитория, открывает интерфейс на весь экран. Слева закреплена колонка из пяти панелей, каждая отвечает за свой участок работы:
- Status - репозиторий, активная ветка и счётчик изменений;
- Files - изменённые, добавленные и удалённые файлы рабочей копии;
- Local branches - локальные ветки, текущая выделена меткой;
- Commits - история коммитов ветки с графом ветвления;
- Stash - накопитель отложенных правок.
Правое поле, главное окно, показывает содержимое выбранного объекта: diff файла, коммиты ветки, файлы коммита или справку. Цифры 1-5 переносят курсор между панелями, tab переключает фокус между колонкой и главным окном, 0 сразу открывает diff. Клавиша enter проваливается глубже: на ветке показывает её коммиты, на коммите - затронутые файлы, на записи накопителя - сохранённые правки. Esc возвращает назад.
Внутри списка перемещаются стрелками или j и k, запятая и точка листают страницы, < и > прыгают к началу и концу, слэш / включает поиск по тексту. Знак ? раскрывает справку по действиям текущего контекста, весь список всё время перед глазами. Плюс переключает режим главного окна - обычный, половинный, полноэкранный, подчёркивание идёт по кругу обратно. R вручную обновляет состояние, ctrl+r открывает список недавних репозиториев, q закрывает программу.
Обновление идёт и само: lazygit опрашивает репозиторий, подтягивает изменения с сервера и замечает правки из соседнего окна редактора. Графический клиент держал всю картину перед глазами; здесь та же полнота обзора, только вместо мыши клавиши.
Разбор изменений перед коммитом и построчный отбор строк в набор коммита
Панель Files перечисляет файлы с пометками статуса: новый, изменённый, удалённый, переименованный, конфликтный. Клавиша space добавляет файл в набор коммита целиком, a готовит сразу всё, что изменилось. Основная работа идёт глубже: enter переносит фокус в diff выбранного файла, и здесь интерфейс повторяет графические клиенты с их галочками у строк.
Diff занимает большую часть экрана и делится на две половины: сверху правки, ещё не попавшие в набор, снизу уже подготовленные. Выделение изначально охватывает целый блок изменений (hunk); space готовит блок и переходит к следующему. Когда в блоке есть лишнее, a включает построчный режим, v выделяет диапазон строк, space готовит ровно отмеченное. Tab переносит выделение в нижнюю половину, где space убирает строки из набора. Возвращаться после этого к однобуквенным подсказкам git add -p не хочется.
Ошибочная правка отменяется на месте: d на неподготовленном блоке сбрасывает изменение с запросом подтверждения, на подготовленном - вынимает строки из набора. E открывает блок во внешнем редакторе, e - файл на выбранной строке, o отдаёт его системной программе по умолчанию. Стрелки влево и вправо, они же h и l, прыгают между блоками, n и N ходят по файлам, ctrl+g показывает список файлов diff.
Мелочи, которых не хватает в чистом терминале: скобки { и } меняют размер контекста вокруг изменений, ctrl+w прячет правки пробелов, скобки ( и ) сдвигают порог похожести, по которому файл считается переименованным, ctrl+t выносит сравнение в difftool.
Коммит с сообщением, правка последнего коммита и деление правок файла на части
Когда набор готов, c открывает панель ввода сообщения. Поле принимает многострочный текст, enter подтверждает коммит, esc отменяет. C отправляет сообщение в текстовый редактор git, когда формулировка длинная и её удобнее писать привычным редактором. Клавиша w коммитит с пропуском предварительных хуков; тот же пропуск срабатывает для сообщения с настроенным префиксом, например WIP.
Самая частая задача после переезда из графического клиента - разложить правки одного файла на несколько осмысленных коммитов. Схема повторяет галочки в графическом интерфейсе: выделить первые строки в diff, space, c, набрать сообщение, enter; выделить следующие строки, space, c, снова сообщение. Файл один, коммитов несколько, и в истории нет каши из несвязанных правок.
A дополняет последний коммит подготовленными изменениями без нового сообщения - быстрый способ докрутить мелочь, о которой забыли минуту назад. На старом коммите та же клавиша работает через переборку: lazygit остановит историю в нужной точке, допишет правки и соберёт ветку обратно. В панели коммитов клавиша a правит атрибуты: сменить автора или добавить соавтора. t создаёт коммит отката, который отменяет изменения выбранного коммита новой записью в истории; так чинят уже опубликованную ветку, где переписывать прошлое нельзя.
Страховка встроена: z откатывает последнюю операцию с коммитами, Z повторяет её. Опора - журнал reflog: неудачная правка сообщения или случайное исключение коммита откатываются одним нажатием. На правки рабочей копии пара не распространяется.
Накопитель stash в роли полки для отложенных правок
Классическая ситуация: правки в разгаре, а в другой ветке ждёт срочная задача. В чистом git это праздник флагов git stash push -u -m, в lazygit короче: s откладывает все изменения одной клавишей, S открывает меню - отложить всё, только подготовленные или только неподготовленные правки. Рабочая копия становится чистой, ветка свободна для переключения.
Записи накопителя лежат в пятой панели. Enter показывает файлы записи, главное окно - её diff. Space применяет запись, оставляя копию в накопителе; g применяет и убирает запись; d удаляет без применения, везде с подтверждением. Если отложенные правки выросли в отдельную задачу, n создаёт из записи новую ветку: lazygit отведёт её от точки сохранения, применит правки и зафиксирует обычным коммитом. r переименовывает запись, чтобы через неделю не вспоминать, что скрывается за "wip".
Под накопителем остаётся обычный stash: записи видны в git stash list из любого клиента. Для параллельных задач есть второй путь - рабочие копии (worktree): w в панели веток создаёт дополнительный каталог с выбранной веткой и сразу переходит в него, переключение между задачами перестаёт требовать полку.
Создание, переключение и слияние веток без заучивания флагов git
Панель Local branches показывает список локальных веток. Space переключается на выбранную ветку, c открывает ввод имени по буквам, дефис возвращает на предыдущую ветку, как cd - в bash. n создаёт ветку от текущего положения, диалог спросит имя и переключаться ли сразу. R переименовывает, d удаляет - с проверкой, слита ли ветка.
Связь с сервером настраивается меню: u назначает или сбрасывает связующую ветку, f делает быструю перемотку, P публикует ветку, p подтягивает изменения. Если связи с сервером нет, lazygit сам предложит настроить её при первой публикации.
Слияние и перенос: M открывает меню слияния выбранной ветки в текущую - обычное или squash-слияние, когда побочная ветка схлопывается в один коммит. r перебазирует текущую ветку на выбранную, перестроив коммиты поверх новой базы. B отмечает опорный коммит: после метки r выполнит перенос через --onto, то есть переедут только коммиты рабочей ветки, не трогая чужие. T ставит метку тега, enter показывает коммиты выбранной ветки, s меняет порядок сортировки.
История читается графом: под коммитами рисуются линии ветвления и точки слияний, как в графическом клиенте. ctrl+l настраивает показ лога - сортировка, скрытие графа, история всех веток сразу; она помогает проверить, попала ли правка в нужную ветку, не листая списки вручную.
Интерактивная переборка истории коммитов и порядок в ветке перед публикацией
Пока ветка не опубликована, историю можно переписать. Клавиша i запускает интерактивную переборку (rebase), и список коммитов превращается в план: p оставить коммит, s объединить с соседним, сохранив оба сообщения, f влить без сообщения, d исключить, e остановиться для правок, r переписать сообщение (R - в редакторе). Ctrl+j и ctrl+k переставляют коммит ниже или выше: порядок меняется нажатиями, а не правкой служебного файла todo. M вызывает меню переборки - продолжить, пропустить конфликтный коммит или остановить операцию целиком.
Каждое действие работает и разово: клавиша s на коммите сама запустит нужную последовательность в фоне. Для серии мелких правок удобна дисциплина fixup: F создаёт коммит с меткой "fixup!" для выбранного коммита, ctrl+f находит базовый коммит для текущих правок автоматически, S собирает накопившиеся fixup-коммиты на места их целей. Ветка превращается в аккуратную цепочку смысловых коммитов.
Самый тонкий инструмент - выборочные наборы правок: enter на старом коммите показывает его файлы, space у выделенного блока добавляет блок в набор, ctrl+p открывает меню - вынести правку в отдельный коммит, убрать её из коммита, применить с обратным знаком. Так разбивают коммит, смешавший две задачи. Проще о том же: d на выделенном блоке в diff старого коммита перепишет коммит без него, переборка в фоне соберёт ветку обратно. От рискованной принудительной публикации страхует опция disableForcePushing в конфиге.
Конфликты слияния с навигацией по спорным местам и собственные команды в конфиге
Слияние или переборка иногда останавливается на конфликте. Файлы с конфликтами подсвечиваются в панели Files, M открывает меню разрешения, главное окно показывает обе правки со служебными маркерами. Ориентироваться просто: h и l ходят между конфликтными местами файла, j и k - между блоками внутри места. Space оставляет выбранную сторону, b оставляет обе, z отменяет последнее решение, e открывает файл во внешнем редакторе для ручной правки. Когда спорные места закончились, m вызывает меню: продолжить, пропустить коммит или остановить операцию и вернуть всё как было.
Вторая половина настройки - собственные команды и клавиши. На Linux конфиг лежит в файле ~/.config/jesseduffield/lazygit/config.yml; клавиша e в панели Status открывает его в редакторе, alt+shift+c делает то же из любого места. Для отдельного репозитория настройки кладут в .git/lazygit.yml, для группы репозиториев - в .lazygit.yml в родительском каталоге; переменная CONFIG_DIR переносит каталог настроек.
Собственные команды описываются списком customCommands:
customCommands:
- key: '<c-g>'
context: 'files'
command: "git log --oneline -- {{.SelectedFile.Name}}"
description: 'История правок выбранного файла'
output: 'popup'
Поле context привязывает клавишу к панели: files, commits, localBranches, stash или global для всей программы. В command подставляются значения из контекста, например имя выбранного файла, а output решает судьбу результата: popup покажет его в окне, terminal отдаст терминалу для интерактивных команд, log впишет в журнал.
Базовое поведение тоже настраивается:
git:
mainBranches: ['master', 'main', 'develop']
diffContextSize: 5
gui:
showFileTree: false
os:
editPreset: 'nvim'
Здесь заданы главные ветки, от которых отсчитывается граница своей истории, контекст в пять строк вокруг правок, плоский список файлов вместо дерева и редактор для клавиши e - файл откроется на строке с изменением. Раздел keybinding переопределяет стандартные клавиши: prevItem и nextItem назначаются на любые сочетания.
В основе всего остаётся обычный git: lazygit только вызывает его команды и рисует результат, не пряча репозиторий в закрытый формат. Графический клиент удобен обзором, терминал - скоростью и доступом с любой машины через ssh. Lazygit собирает оба достоинства на одном экране: панели с состоянием, разбор правок по строкам, коммиты по частям файла, порядок в истории, накопитель для отложенного - всё то же, только без мыши. Неделя практики, и рука сама тянется к space вместо галочки.