Ежедневно разработчик десятки раз набирает git status, git log, git checkout. Каждая такая команда короткая, но суммарно в день уходят минуты на рутинный ввод, а главное, ломается ритм работы. Алиасы в git config решают эту задачу напрямую: вместо длинной команды с флагами остаётся два или три символа. Удобно то, что алиасы живут в конфиге пользователя, переезжают вместе с dotfiles на любую машину и никак не меняют сам Git. Ниже разберём реальные алиасы для просмотра истории, статуса и переключения веток, научимся запускать shell-команды через восклицательный знак и соберём рабочий процесс вокруг набора сокращений.
Механика алиасов в git config и способы их задать
Алиас хранится в секции alias конфигурационного файла Git. Проще всего добавить его командой git config --global alias.st status, после которой вызов git st станет полностью эквивалентен git status. Ключ --global записывает значение в файл ~/.gitconfig, то есть настройка действует для всех репозиториев пользователя. Если убрать ключ, алиас попадёт в .git/config текущего проекта и будет доступен только там. Это удобно для сокращений, специфичных для одного продукта, скажем, ссылки на внутренний трекер в сообщениях коммитов.
Когда Git встречает первую лексему команды, он ищет её среди алиасов. Если совпадение найдено, строка значения подставляется вместо имени алиаса, а оставшиеся аргументы командной строки присоединяются в конец. Поэтому git co main корректно разворачивается в git checkout main без какой-либо дополнительной настройки. Важный нюанс: подстановка происходит только по первому слову, так что git checkout co алиас co не найдёт.
Тот же файл можно править руками. Открываем ~/.gitconfig в редакторе и видим типичную картину:
[alias]
st = status -sb
co = checkout
br = branch
lg = log --oneline --graph --decorate --all -10
last = log -1 HEAD --stat
unstage = reset HEAD --
Ручное редактирование нравится многим инженерам: все сокращения лежат списком, легко комментируются и копируются между машинами. Проверить, как Git видит значение, помогает git config --get alias.lg, а полный перечень алиасов показывает git config --get-regexp alias.
Сокращения для статуса и переключения веток с разбором вывода
Начнём с двух самых частых операций. Команда git config --global alias.st "status -sb" создаёт алиас, который показывает компактный статус рабочего дерева. Длинный вывод git status уместен при знакомстве с чужим репозиторием, но в ежедневной работе он шумный. После настройки вызов git st даёт примерно такое:
## main...origin/main [ahead 2]
M src/app.ts
M src/config.ts
?? notes.md
Разберём построчно. Первая строка с двумя решётками показывает имя текущей ветки, её upstream и отставание или опережение: [ahead 2] означает два локальных коммита, ещё не ушедшие на сервер, и появляется благодаря флагу -b. Флаг -s включает короткий формат с одной строкой на файл. Первая буква в колонке описывает индекс, вторая описывает рабочее дерево. " M src/app.ts" читается так: файл изменён в рабочем дереве, но не добавлен в индекс. "M src/config.ts" означает, что правка уже в индексе и готова к коммиту. Два вопросительных знака помечают неотслеживаемый файл notes.md.
Второй алиас создаётся командой git config --global alias.co checkout. С этого момента git co feature/login переключает ветку, git co -b fix/typo создаёт новую ветку от текущего состояния, а git co -- src/app.ts откатывает правки конкретного файла. Последний случай поучителен: сокращение настолько сливается с привычкой, что легко случайно потерять несохранённые изменения. Профилактика простая: перед разрушительной формой команды взглянуть на git st.
Аргументы после алиаса Git присоединяет автоматически, поэтому не нужно городить обёртки ради передачи параметров. Но есть тонкость с цитированием: пробелы и флаги в значении алиаса при записи через git config надо брать в кавычки, иначе оболочка разрежет строку не так, как ожидается, и в конфиг попадёт только слово status.
Граф истории через алиас lg и чтение его вывода
Классика жанра и самый полезный алиас из возможных ставится так: git config --global alias.lg "log --oneline --graph --decorate --all". Вызов git lg превращает плоский журнал в наглядную схему ветвления:
* 8f3a1c2 (HEAD -> main) Merge branch 'feature/search'
|\
| * 51d0be7 (feature/search) Add fuzzy matching
| * a94e2d1 Wire search API to UI
* | 2c7bb90 (origin/main, tag: v1.4.0) Bump version
|/
* d3e551c Fix null check in parser
Разберём, что именно делают флаги и строки вывода. --oneline сжимает каждый коммит до короткого хеша и первой строки сообщения. --graph рисует псевдографику из звёздочек и вертикальных линий: в примере видно, как ветка feature/search отошла от d3e551c и вернулась слиянием 8f3a1c2. --decorate подписывает коммиты именами веток, метками и указателем HEAD, поэтому сразу ясно, где находится локальная main, куда смотрит origin/main и на каком коммите стоит тег v1.4.0. --all строит граф по всем веткам сразу, а не только по текущей, это ключевой флаг для понимания общей картины. Строки с вертикальной чертой и слэшами показывают схождение двух линий истории в точке d3e551c.
Чтобы граф не уползал за экран, часто добавляют ограничение: lg = log --oneline --graph --decorate --all -10. Ещё одна рабочая вариация выводит автора и относительное время: alias.lg "log --graph --pretty=format:'%h %s %an %ar' --all". Короткий хеш берётся из %h, тема из %s, автор из %an, а %ar показывает "2 hours ago". Ещё два полезных плейсхолдера для такого формата: %d выводит декорации вроде имён веток прямо в строку, а %ad дату коммита, при этом --date=short делает её короткой, вида 2026-10-07. Комбинация log --graph --oneline --decorate --date=short --pretty=format:'%h %ad %s %d' --all даёт граф с датами и метками в одной строке. Слишком длинные форматы, честно говоря, убивают главное достоинство алиаса, скорость чтения, поэтому разумнее держать lg компактным, а подробности смотреть другой командой.
Алиасы с восклицательным знаком, unstage и last
Когда значения одной командой Git мало, на помощь приходит префикс "!". Алиас, чьё значение начинается с восклицательного знака, исполняется как shell-команда из корня репозитория. Простейший пример: git config --global alias.untracked "!git ls-files --others --exclude-standard". После этого git untracked молча перечислит все неотслеживаемые файлы без обвязки status.
Для двух частых бытовых задач shell даже не нужен. Алиас unstage ставится командой git config --global alias.unstage "reset HEAD --" и убирает файл из индекса, не трогая рабочее дерево: git unstage src/config.ts возвращает файл из состояния "M " в " M". Алиас last показывает свежайший коммит со статистикой: git config --global alias.last "log -1 HEAD --stat". Его вывод:
commit 8f3a1c2b9c4f... (HEAD -> main)
Author: Ivan Petrov <Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. >
Date: Tue Oct 7 18:42:11 2026 +0300
Merge branch 'feature/search'
src/search.ts | 31 +++++++++++++++++++++++++
src/app.ts | 4 ++--
2 files changed, 33 insertions(+), 2 deletions(-)
Строка commit содержит полный хеш. Флаг -1 ограничивает вывод одним коммитом, HEAD указывает цель явно, а --stat добавляет сводку по файлам: сколько строк добавлено плюсами, сколько удалено минусами. Плюсики и минусики в строке src/search.ts не точный счёт, а пропорциональная шкала, что бывает неожиданно для новичков.
Для сложных сценариев, где нужна обработка аргументов перед вызовом Git, используется конструкция "!sh -c '...'":
[alias]
syncup = "!sh -c 'git fetch --prune && git rebase origin/main' -"
pushed = "!sh -c 'git log --oneline origin/$(git branch --show-current)..HEAD' -"
Здесь syncup сначала подтягивает обновления с удалённого репозитория с чисткой устаревших веток, затем перебазирует текущую работу поверх origin/main. Алиас pushed перечисляет коммиты, которые есть локально, но ещё не отправлены: диапазон origin/<текущая ветка>..HEAD считается динамически через branch --show-current. Тире в конце передаётся в sh как $0, это привычный приём, чтобы аргументы после алиаса корректно дошли до вложенной команды. Именно здесь кроется большинство ошибок цитирования: одинарные и двойные кавычки вкладываются друг в друга, и одна пропущенная кавычка превращает алиас в загадочный синтаксический сброс ошибки sh.
Типичные ошибки при настройке и их диагностика
С алиасами связан предсказуемый набор промахов, и почти каждый диагностируется за минуту. Перечислим основные:
- Потерянные кавычки при записи через git config, из-за чего в значение попадает только первое слово, а git lg молча превращается в обычный log;
- Двойное слово git внутри значения, алиас вида alias.st = git status выдаст ошибку "git: 'git' is not a git command", потому что Git подставляет значение после себя самого;
- Имя алиаса совпадает со встроенной командой, alias.checkout тихо игнорируется, оригинальный checkout всегда выигрывает;
- Символы $ и обратные кавычки в shell-алиасе раскрываются внешней оболочкой раньше времени, если строку взять в двойные кавычки вместо одинарных;
- Алиас записан локально в репозиторий, а проверяется в другом проекте, и человек минуту недоумевает, куда пропало сокращение.
Первый шаг диагностики всегда один: git config --get alias.st показывает, что реально записано в конфиг. Если значение усечено, проблема в кавычках команды регистрации. Если значение верное, а поведение странное, смотрят git config --show-origin --get-regexp alias, эта команда печатает файл, из которого взято каждое значение, и сразу видно конфликт между system, global и local уровнями. Полезно помнить порядок: local перекрывает global, global перекрывает system. И ещё одна ловушка из практики: алиас в репозитории на сервере сборки не существует, поэтому скрипты CI должны вызывать полные команды, иначе сборка падает на первом же git co.
Пошаговый рабочий процесс и поддержание набора в форме
Соберём типичный цикл правки кода целиком на алиасах. Утром разработчик выполняет git syncup, чтобы получить свежий origin/main и сесть поверх него. Затем git co -b feature/export создаёт рабочую ветку. В процессе правок git st показывает две строки состояния вместо простыни текста, изменения добавляются привычным git add -p. Перед коммитом беглый git lg напоминает, как история ляжет в общий граф. После коммита git pushed проверяет, что ждёт отправки, а git push завершает цикл. Если файл случайно попал в индекс, на помощь приходит git unstage путь/к/файлу. Закончив день, быстрый git last подтверждает содержимое свежего коммита перед тем как закрыть терминал.
Набор сокращений хорошо живёт, когда за ним следят. Профилактика несложная: раз в пару месяцев выполнить git config --get-regexp alias и честно удалить то, чем не пользуешься. Скопившиеся мёртвые алиасы засоряют память не хуже закладок в браузере. Проверить, реальная ли команда скрывается за сокращением, помогает GIT_TRACE=1 git lg: трассировка первая строка покажет раскрытие алиаса в полную форму. Файл ~/.gitconfig стоит держать в личном репозитории dotfiles и ставить симлинк, тогда настройка новой машины сводится к клонированию.
Есть и граница разумного. Алиас не должен таить в себе разрушительных действий без явного вызова: сокращения вокруг reset --hard или push --force лучше называть длинно и страшно, чтобы пальцы не обгоняли мысль. Shell-обёртки стоит оставлять короткими: как только логика перерастает пять строк, честнее вынести её в исполняемый скрипт git-something в PATH, Git сам подхватит его как подкоманду git something. С небольшим набором из st, co, lg, last, unstage и пары shell-помощников работа в терминале становится заметно быстрее: меньше набора текста, меньше опечаток и совсем другой темп, когда история проекта читается одним взглядом на компактный граф. Проверить итоговый конфиг помогает команда git config --list --show-origin: она выводит все настройки с указанием файла, из которого каждая взята. Если на новой машине алиас вдруг ведёт себя иначе, эта команда первым делом показывает, не подмешался ли локальный конфиг репозитория с одноимённым ключом. А держать в голове единственное правило достаточно просто: алиас экономит набор текста, но не отменяет понимания того, что именно будет выполнено, и пара секунд на git st перед любой откатывающей командой до сих пор остаётся самой дешёвой страховкой.