Как изменить автора коммита в Git: имя, email и дата
Иногда случается, что вы совершили коммит с неправильным автором. Распространенные причины:
- Вы коммитили на личном лаптопе с рабочей конфигурацией Git
- Перешли на работу и забыли переключить конфигурацию
- Допустили опечатку в имени или email
- Корпоративные требования: все коммиты должны быть от компании
- Работаете на нескольких проектах с разными email адресами
Хорошая новость: Git позволяет изменить автора коммита на любом этапе. Процесс зависит от того, какие коммиты нужно исправить: только последний или несколько.
Исправить автора последнего коммита #
Это самый простой случай. Используйте флаг --amend:
Способ 1: Указать нового автора напрямую #
git commit --amend --author="John Doe <[email protected]>"
Это изменяет автора последнего коммита и открывает редактор для редактирования сообщения. Если вам не нужно редактировать сообщение, используйте --no-edit:
git commit --amend --author="John Doe <[email protected]>" --no-edit
Способ 2: Изменить конфигурацию, потом перезаписать #
Этот способ удобнее, если вы хотите использовать новый author для будущих коммитов:
# 1. Обновите конфигурацию Git
git config user.name "John Doe"
git config user.email "[email protected]"
# 2. Переименуйте автора в последнем коммите, используя переменные окружения
# (удобнее чем вводить вручную)
git commit --amend --reset-author --no-edit
# 3. Для будущих коммитов будет использоваться новый author
Флаг --reset-author особенно полезен, потому что берет информацию о пользователе из текущей конфигурации.
Способ 3: Изменить только email #
Если нужно изменить только email сохраняя имя:
# 1. Скопируйте текущее имя
git log -1 --format=%an # получить имя последнего коммита
# 2. Используйте его с новым email
git commit --amend --author="John Doe <[email protected]>" --no-edit
Пример #
# Проверим текущий автор
git log -1 --oneline --format="%an <%ae>"
# OldName <[email protected]>
# Исправляем
git commit --amend --author="John Doe <[email protected]>" --no-edit
# Проверяем результат
git log -1 --oneline --format="%an <%ae>"
# John Doe <[email protected]>
# Push (требуется force push так как хеш изменился)
git push origin main --force
Исправить автора нескольких коммитов #
Если нужно изменить автора в нескольких коммитах, используйте интерактивный rebase:
Способ 1: Interactive Rebase с амендом #
# Изменить автора в последних 5 коммитах
git rebase -i HEAD~5
Откроется редактор со списком коммитов:
pick abc1234 First commit
pick def5678 Second commit
pick ghi9012 Third commit
pick jkl3456 Fourth commit
pick mno7890 Fifth commit
Измените pick на edit для коммитов, в которых нужно изменить автора:
pick abc1234 First commit
edit def5678 Second commit
edit ghi9012 Third commit
pick jkl3456 Fourth commit
pick mno7890 Fifth commit
Сохраните (:wq в vim или Ctrl+S в других редакторах).
Git остановится на каждом edit коммите. Для каждого:
# Когда Git останавливается на коммите, выполните:
git commit --amend --author="John Doe <[email protected]>" --no-edit
# Потом продолжите rebase
git rebase --continue
Цикл повторяется для каждого edit коммита.
Способ 2: Скрипт для автоматизации #
Если нужно изменить автора в большом количестве коммитов, напишите скрипт:
#!/bin/bash
# change-author.sh
OLD_NAME="OldName"
OLD_EMAIL="[email protected]"
NEW_NAME="John Doe"
NEW_EMAIL="[email protected]"
git filter-repo \
--commit-callback '
if commit.author.name == b"'"$OLD_NAME"'" and commit.author.email == b"'"$OLD_EMAIL"'":
commit.author.name = b"'"$NEW_NAME"'"
commit.author.email = b"'"$NEW_EMAIL"'"
' \
--force
Запустите:
bash change-author.sh
Практический пример #
# Проверим историю
git log --oneline --format="%an <%ae>" | head -10
# OldName <[email protected]>
# OldName <[email protected]>
# OldName <[email protected]>
# John Doe <[email protected]>
# ...
# Нужно изменить первые 3 коммита
git rebase -i HEAD~10
# В редакторе меняем первые 3 на "edit"
# edit abc1234
# edit def5678
# edit ghi9012
# pick ...
# Git останавливается на первом edit коммите
git commit --amend --author="John Doe <[email protected]>" --no-edit
git rebase --continue
# То же самое для второго коммита
git commit --amend --author="John Doe <[email protected]>" --no-edit
git rebase --continue
# И для третьего
git commit --amend --author="John Doe <[email protected]>" --no-edit
git rebase --continue
# Готово! Проверяем результат
git log --oneline --format="%an <%ae>" | head -10
# John Doe <[email protected]>
# John Doe <[email protected]>
# John Doe <[email protected]>
# John Doe <[email protected]>
# ...
Изменить автора во ВСЕЙ истории глобально #
Если нужно изменить автора во всех коммитах репозитория (например, при миграции с одного компьютера на другой), используйте git-filter-repo.
Установка git-filter-repo #
# Требуется Python 3
# На macOS
brew install git-filter-repo
# На Linux
pip3 install git-filter-repo
# На Windows
pip install git-filter-repo
Изменение автора во всей истории #
# Установите новую конфигурацию
git config user.name "John Doe"
git config user.email "[email protected]"
# Измените автора для всех коммитов
git filter-repo --name-callback 'return b"John Doe"' \
--email-callback 'return b"[email protected]"' \
--force
# Проверяем результат
git log --oneline --format="%an <%ae>" | head -5
# John Doe <[email protected]>
# John Doe <[email protected]>
# ...
Более сложный пример: изменить автора только для конкретного email #
# Если ваша старая конфигурация была неправильной
git filter-repo --commit-callback '
import re
if commit.author.email == b"[email protected]":
commit.author.name = b"John Doe"
commit.author.email = b"[email protected]"
commit.committer.name = b"John Doe"
commit.committer.email = b"[email protected]"
' --force
Важно: После использования git-filter-repo нужно сделать force push:
# Backup на случай ошибки
git branch backup
# Force push (очень осторожно!)
git push origin --force --all
git push origin --force --tags
Настройка разных авторов для разных репозиториев #
Лучший способ избежать этой проблемы в будущем — настроить разные авторы для разных проектов.
Вариант 1: Локальная конфигурация для каждого репозитория #
# Для проекта работы
cd ~/work/company-project
git config user.name "John Doe"
git config user.email "[email protected]"
# Для личного проекта
cd ~/personal/hobby-project
git config user.name "John Doe"
git config user.email "[email protected]"
# Проверим (без --global)
git config user.email
# [email protected] (если вы в hobby-project)
Вариант 2: Глобальная конфигурация с переопределением #
# Глобальная конфигурация (по умолчанию)
git config --global user.name "John Doe"
git config --global user.email "[email protected]"
# Для конкретного репозитория переопределить
cd ~/work/company-project
git config user.name "John Doe"
git config user.email "[email protected]"
Вариант 3: Условное включение конфигурации (includeIf) #
Самый удобный способ — использовать includeIf в .gitconfig:
# Отредактируйте ~/.gitconfig
nano ~/.gitconfig
Добавьте:
[user]
name = John Doe
email = [email protected]
# Переопределить для всех проектов в ~/work/
[includeIf "gitdir:~/work/"]
path = ~/.gitconfig-work
# Переопределить для всех проектов в ~/freelance/
[includeIf "gitdir:~/freelance/"]
path = ~/.gitconfig-freelance
Создайте файлы для разных конфигураций:
# ~/.gitconfig-work
cat > ~/.gitconfig-work << EOF
[user]
name = John Doe
email = [email protected]
EOF
# ~/.gitconfig-freelance
cat > ~/.gitconfig-freelance << EOF
[user]
name = John Doe
email = [email protected]
EOF
Проверьте что работает:
# В проекте из ~/work
cd ~/work/company-project
git config user.email
# [email protected]
# В личном проекте
cd ~/hobby-project
git config user.email
# [email protected]
Это решение работает идеально и вам больше не нужно помнить переключать конфигурацию!
Различие между author и committer #
В Git есть два разных поля в коммите:
author: тот кто написал код
committer: тот кто сделал коммит
Обычно они одинаковые. Но когда вы используете git commit --amend, может измениться только author. Если нужно изменить committer:
# Измените оба
git commit --amend --author="John Doe <[email protected]>" \
--date="2026-02-09 10:00:00" \
--no-edit
# Или используйте переменные окружения
GIT_AUTHOR_NAME="John Doe" \
GIT_AUTHOR_EMAIL="[email protected]" \
GIT_COMMITTER_NAME="John Doe" \
GIT_COMMITTER_EMAIL="[email protected]" \
git commit --amend --no-edit
Проверка автора в истории #
# Простой список авторов
git log --oneline --format="%an <%ae>"
# Группировка по авторам (сколько коммитов от каждого)
git shortlog -s -n
# 42 John Doe
# 15 Jane Smith
# 8 Bob Johnson
# Детальный лог с автором
git log --format="%h | %an | %ae | %s" --all
# Для конкретного файла
git log --oneline --format="%an" -- src/app.js | sort | uniq -c
FAQ #
В: Изменится ли хеш коммита после изменения автора? О: Да! Хеш коммита зависит от содержимого, автора, даты и других полей. Изменение автора меняет хеш. Это требует force push на сервер.
В: Безопасно ли делать force push после изменения автора? О: Только если вы уверены что никто не скачивал старую историю. В личных branch безопасно. В main/master - обсудите с командой. Обычно лучше создать новый коммит с нужным автором, чем переписывать историю.
В: Как откатить изменение автора если я ошибся? О: Используйте reflog:
git reflog # найти старое состояние
git reset --hard <старый-хеш>
В: Могу ли я изменить дату коммита? О: Да, вместе с автором:
git commit --amend --author="John Doe <[email protected]>" \
--date="2026-02-09"
В: Что делать если я внес ошибку в filter-repo? О: У вас есть backup ветка:
git reflog # найти свежую историю
git reset --hard <свежий-хеш>
В: Как изменить только committer, но не author? О: Используйте переменные окружения:
GIT_COMMITTER_NAME="New Name" \
GIT_COMMITTER_EMAIL="[email protected]" \
git commit --amend --no-edit
Наилучшие практики #
Предотвращение проблемы:
# Сразу при установке Git git config --global user.name "John Doe" git config --global user.email "[email protected]"Для работы и личных проектов:
# Используйте includeIf в .gitconfig # Автоматически переключает email по директорииПроверьте перед push:
# Перед первым push проверьте автора git log --format="%an <%ae>" # Убедитесь что это правильноДля команды:
- Добавьте проверку в pre-commit hook
- Требуйте определенный формат author
- Документируйте соглашение (company email или личный?)
Заключение #
Изменение автора коммита в Git просто, но выбор метода зависит от ситуации:
- Последний коммит:
git commit --amend --author="..." --no-edit - Несколько коммитов:
git rebase -iс--amend - Вся история:
git-filter-repo - На будущее: используйте
includeIfв .gitconfig
Самое главное — избежать этой проблемы с самого начала, правильно настроив Git конфигурацию для каждого контекста (работа, личные проекты, клиенты).
Читайте также:
- /ru/git/nastrojka-polzovatelya-git/ — подробная настройка Git
- /ru/git/git-commit-amend/ — как использовать –amend
- /ru/git/git-rebase/ — интерактивный rebase и его возможности