open atlas
↑ К треку
Git: от нуля до сеньора GIT · 07 · 05

Алиасы и конфигурация

git config настраивает git под твои руки. Алиасы сокращают команды (alias.co checkout, лог-граф, shell-алиасы через !). Настройки вроде pull.rebase и push.autoSetupRemote убирают ежедневное трение. У конфигурации три уровня — system, global, local — и побеждает самый конкретный.

GIT Middle ◷ 15 min
Уровень
ОсновыJuniorMiddleSenior

Ты набираешь git checkout, git status и длинный git log --oneline --graph --decorate --all десятки раз в день. И ещё перечиняешь одни и те же раздражители на каждой машине: шумный merge-пузырь на каждом pull, необходимость прописывать --set-upstream на первом push каждой ветки. Всё это настраивается один раз и забывается. Инструмент — git config, и его освоение превращает git из того, с чем ты дерёшься, в то, что подогнано под твои руки.

К концу этого урока ты сможешь писать алиасы (включая shell-овые), задавать параметры конфигурации, убирающие ежедневное трение, и рассуждать о том, какой из трёх уровней конфигурации git реально применяется.

Цель

После этого урока ты сможешь создавать git-алиасы для частых и shell-овых команд, задавать эргономичные параметры вроде pull.rebase и push.autoSetupRemote и объяснять три уровня конфигурации git — system, global, local — и какой из них побеждает.

1

Алиас — это запись конфигурации, переименовывающая команду — пиши его через git config. Под капотом алиас — просто ключ в секции alias.. Классические короткие формы:

git config --global alias.co checkout
git config --global alias.st status
git config --global alias.br branch
git config --global alias.cm commit

Теперь git co main выполняет git checkout main. Они живут в твоей глобальной конфигурации, поэтому следуют за тобой по каждому репозиторию на машине. Определи их единожды, и экономия накапливается на тысячах вызовов.

2

Алиасы могут разворачиваться в команды со множеством флагов — знаменитый из них лог-граф. Значением алиаса может быть целая строка аргументов — так все и приходят к однословной красивой истории:

git config --global alias.lg "log --oneline --graph --decorate --all"
git lg     # полный аннотированный граф коммитов, в две буквы

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

3

Поставь перед алиасом !, чтобы выполнить shell-команду, а не только git-подкоманду. Когда значение алиаса начинается с !, git прогоняет его через shell, так что можно сцеплять команды, вызывать другие инструменты или строить маленькие скрипты:

git config --global alias.last "log -1 HEAD"          # обычная git-подкоманда
git config --global alias.unstage "reset HEAD --"     # обычная git-подкоманда
git config --global alias.pushup "!git push -u origin HEAD"   # shell: работает на любой ветке

Форма ! открывает всё, что умеет shell, но также означает, что алиас больше не чистая git-команда — он выполняется из корня репозитория и может вызывать не-git программы, так что держи такие читаемыми.

4

Горстка параметров конфигурации убирает большую часть ежедневного трения. Это настройки, которые опытные инженеры задают на свежей машине прежде всего остального:

git config --global pull.rebase true          # rebase при pull вместо merge-пузырей
git config --global rebase.autostash true     # авто-stash грязных изменений вокруг rebase
git config --global push.autoSetupRemote true # первый push сам задаёт upstream
git config --global init.defaultBranch main   # новые репозитории стартуют на 'main'
git config --global rerere.enabled true       # запомнить, как ты разрешил конфликт, и повторить
git config --global column.ui auto            # аккуратный многоколоночный вывод списков
git config --global core.editor "code --wait" # использовать твой редактор для сообщений коммитов

Каждый тихо устраняет повторяющийся раздражитель: больше нет merge-пузырей от рутинных pull, нет ручного --set-upstream, нет повторного разрешения одного и того же конфликта (rerere).

Почему это работает

Почему у git три уровня конфигурации? Потому что разные настройки принадлежат разным временам жизни. System (/etc/gitconfig, задаётся через --system) применяется к каждому пользователю на машине — редкость, обычно ставится админом. Global (~/.gitconfig, --global) — твой личный дефолт по всем репозиториям — где живут твоё имя, email и алиасы. Local (.git/config, --local, по умолчанию) — на каждый репозиторий — где рабочий email или специфичная для проекта настройка перекрывает глобальную. Разделение позволяет одной настройке (скажем, твоему email для коммитов) быть личным дефолтом глобально, но быть перекрытой для репозитория одного клиента локально.

Разбор примера

Email на репозиторий, перекрывающий твой личный дефолт.

Твоя глобальная конфигурация использует личный email для всего. Для репозитория одного клиента нужно коммитить с рабочим email. Задай его локально — внутри этого репозитория — и подтверди, какое значение побеждает:

git config --global user.email "me@personal.dev"   # твой дефолт, задан единожды глобально
cd ~/work/client-repo
git config --local user.email "me@client.com"      # перекрытие, только в ЭТОМ репозитории
git config user.email
# me@client.com   <- local бьёт global
git config --list --show-origin | grep user.email
# file:/home/me/.gitconfig        user.email=me@personal.dev
# file:.git/config                user.email=me@client.com

git config --list --show-origin — это инструмент, завершающий каждый спор «какое значение реально действует?»: он печатает каждую настройку и точный файл, из которого она пришла, так что приоритет виден, а не угадывается. В этом репозитории побеждает локальный me@client.com; везде ещё применяется твой глобальный личный email.

Частая ошибка

Классическая путаница — задать что-то через --global и удивляться, что конкретный репозиторий это игнорирует, или наоборот. Причина почти всегда в более конкретном local-значении, перекрывающем глобальное. Когда git «не использует мою конфигурацию», не угадывай: выполни git config --list --show-origin (или git config --show-origin <key>) и прочитай, из какого файла приходит действующее значение. Другая ловушка — задать user.email только глобально и случайно закоммитить в рабочий репозиторий с личным адресом — задавай локальное перекрытие осознанно на репозиторий, когда это важно.

Проверь себя
Викторина

user.email задан одним значением через --global и другим через --local внутри конкретного репозитория. Какое значение использует коммит в этом репозитории?

Итог

git config настраивает git под твои руки. Алиасы (alias.co checkout, алиас на log --oneline --graph --decorate --all и shell-алиасы с префиксом !) сокращают набор команд, которые ты гоняешь весь день. Несколько эргономичных настроек — pull.rebase, rebase.autostash, push.autoSetupRemote, init.defaultBranch, rerere.enabled, core.editor — устраняют повторяющееся трение на каждой машине. Конфигурация живёт на трёх уровнях — system, global (~/.gitconfig) и local (.git/config) — и побеждает самый конкретный, так что local перекрывает global, а тот — system. Когда настройка будто игнорируется, git config --list --show-origin покажет, из какого именно файла пришло действующее значение. Ты собрал набор ежедневных мощных инструментов: stash, cherry-pick, теги, рабочие деревья и git, подогнанный под тебя.

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 4 завершено

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.