Настройка Git: имя, email, SSH и первый репозиторий

Прежде чем начать работать с Git, нужно один раз настроить окружение: указать имя и email, сгенерировать SSH-ключ, задать редактор и несколько полезных опций. Без этого первый же git push закончится ошибкой Permission denied, а коммиты будут подписаны как «unknown».

Настройка занимает 10-15 минут, но экономит часы в будущем. В этом уроке разберём всё по шагам.

Три уровня конфигурации

Git хранит настройки на трёх уровнях, каждый из которых переопределяет предыдущий:

# Системный (для всех пользователей ОС)
git config --system <key> <value>
# файл: /etc/gitconfig

# Глобальный (для текущего пользователя)
git config --global <key> <value>
# файл: ~/.gitconfig или ~/.config/git/config

# Локальный (для конкретного репозитория)
git config --local <key> <value>
# файл: .git/config в корне репозитория

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

# Посмотреть все настройки и откуда они берутся
git config --list --show-origin

Имя и email

Каждый коммит содержит имя автора и email. Это не авторизация - Git не проверяет, что email настоящий. Но GitLab/GitHub привязывают коммиты к аккаунтам по email, поэтому важно указать тот же email, что в профиле на хостинге.

git config --global user.name "Dmitriy Popov"
git config --global user.email "user@example.com"

# Проверить
git config --global --list | grep user
Если у тебя два аккаунта (личный GitHub, рабочий GitLab), не ставь рабочий email глобально. Лучше настрой conditional includes:
# ~/.gitconfig
[includeIf "gitdir:~/work/"]
    path = ~/.gitconfig-work

# ~/.gitconfig-work
[user]
    name = "Dmitriy Popov"
    email = "user@company.com"

Все репозитории внутри ~/work/ автоматически подхватят рабочий email.

Полезные глобальные настройки

# Редактор для коммит-сообщений (по умолчанию vim)
git config --global core.editor "code --wait"    # VS Code
git config --global core.editor "nano"            # nano

# Ветка по умолчанию при git init
git config --global init.defaultBranch main

# pull --rebase по умолчанию (вместо merge)
git config --global pull.rebase true

# Цветной вывод
git config --global color.ui auto

# Автоматически убирать trailing whitespace при apply
git config --global apply.whitespace fix

# Показывать diff в редакторе при написании коммит-сообщения
git config --global commit.verbose true

Опция pull.rebase меняет поведение git pull: вместо merge-коммита Git переложит твои коммиты поверх свежего remote. Почему это обычно лучше - разбираем в уроке merge vs rebase.

Git aliases

Aliases сокращают длинные команды. Они сохраняются в ~/.gitconfig:

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.lg "log --oneline --graph --decorate --all"
git config --global alias.last "log -1 HEAD"
git config --global alias.unstage "reset HEAD --"

После этого git lg покажет красивый граф истории, а git st заменит git status. Что ещё умеет git log и как искать по истории - в уроке про log, blame и bisect.

SSH-ключ для GitLab/GitHub

SSH-ключ позволяет аутентифицироваться без ввода пароля при каждом push/pull.

Генерация ключа

# Ed25519 - современный и быстрый алгоритм
ssh-keygen -t ed25519 -C "gitlab:user@example.com"

# Если система не поддерживает Ed25519 (очень старый OpenSSH)
ssh-keygen -t rsa -b 4096 -C "gitlab:user@example.com"

При генерации можно задать passphrase - дополнительный пароль для ключа. Рекомендуется для безопасности.

Добавление ключа в ssh-agent

# Запустить агент
eval "$(ssh-agent -s)"

# Добавить ключ (на macOS - с сохранением в Keychain)
ssh-add ~/.ssh/id_ed25519          # Linux
ssh-add --apple-use-keychain ~/.ssh/id_ed25519   # macOS

Добавление публичного ключа на хостинг

# Скопировать публичный ключ
cat ~/.ssh/id_ed25519.pub

# macOS: скопировать сразу в буфер обмена
pbcopy < ~/.ssh/id_ed25519.pub

Затем: GitLab → Settings → SSH Keys → вставить ключ.

Проверка подключения

ssh -T git@gitlab.com
# Ожидаемый ответ: Welcome to GitLab, @username!

ssh -T git@github.com
# Ожидаемый ответ: Hi username! You've successfully authenticated...

Несколько SSH-ключей (~/.ssh/config)

Если у тебя несколько аккаунтов (личный GitHub + рабочий GitLab), нужен файл ~/.ssh/config:

# Личный GitHub
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_personal
    IdentitiesOnly yes

# Рабочий GitLab
Host gitlab.company.com
    HostName gitlab.company.com
    User git
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes

Теперь git clone git@github.com:user/repo.git использует личный ключ, а git clone git@gitlab.company.com:team/project.git - рабочий.

HTTPS проще в настройке (не нужен SSH-ключ), но требует вводить логин/пароль или настраивать credential helper. SSH удобнее для повседневной работы - один раз настроил и забыл. В командах Git используется практически всегда SSH.

GPG-подпись коммитов

GPG-подпись добавляет криптографическое подтверждение, что коммит действительно сделан тобой. На GitHub/GitLab такие коммиты получают зелёную плашку «Verified».

# Сгенерировать GPG-ключ
gpg --full-generate-key
# Выбрать RSA and RSA, 4096 бит, указать тот же email, что в Git

# Посмотреть ID ключа
gpg --list-secret-keys --keyid-format=long
# sec   rsa4096/ABCDEF1234567890 ...

# Настроить Git
git config --global user.signingkey ABCDEF1234567890
git config --global commit.gpgsign true

# Экспортировать публичный ключ для GitLab/GitHub
gpg --armor --export ABCDEF1234567890
Подпись коммитов - хорошая практика, но не блокирующая. Настрой SSH сначала, а GPG добавишь позже, когда привыкнешь к Git.

Первый репозиторий

mkdir hello-git && cd hello-git
git init

# Проверим, что всё настроено
git config user.name
git config user.email

# Создадим файл и сделаем первый коммит
echo "# Hello Git" > README.md
git add README.md
git commit -m "init: add README"

# Посмотреть историю
git log --oneline

Если нужно подключить удалённый репозиторий:

# Создай пустой репозиторий на GitLab/GitHub, затем:
git remote add origin git@gitlab.com:user/hello-git.git
git push -u origin main

Ещё до первого коммита стоит завести .gitignore, чтобы в репозиторий не уехали бинарники, .env и папки IDE - как его составить, разбираем в уроке про gitignore и секреты.

Типичные проблемы при настройке

Permission denied (publickey) - SSH-ключ не добавлен в ssh-agent или на хостинг. Проверь ssh-add -l и убедись, что публичный ключ добавлен в настройках GitLab/GitHub.

Author identity unknown - не настроены user.name и user.email. Git откажется делать коммит, пока не укажешь.

remote: Repository not found - неправильный URL remote или нет доступа. Проверь git remote -v и права в настройках репозитория.

Could not open a connection to your authentication agent - ssh-agent не запущен. Выполни eval "$(ssh-agent -s)".

Мини-задание

  • Настрой user.name и user.email глобально
  • Добавь alias git lg для красивого графа истории
  • Сгенерируй SSH-ключ и добавь его в GitLab или GitHub
  • Проверь подключение: ssh -T git@gitlab.com (или github.com)
  • Создай репозиторий, сделай первый коммит и запушь на remote

Зарегистрируйтесь бесплатно, чтобы пройти квиз, вести прогресс.