Что делает команда git commit —amend и когда её использовать?

«Что делает команда git commit —amend и когда её использовать?» — вопрос из категории DevOps, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

git commit --amend — это команда для изменения последнего коммита в текущей ветке. Она не создает новый коммит, а модифицирует существующий, заменяя его старый хеш на новый.

Типичные сценарии использования:

  1. Исправить сообщение последнего коммита:

    git commit --amend -m "Новое, более ясное сообщение коммита"
  2. Добавить забытые файлы в последний коммит:

    git add забытый_файл.txt
    git commit --amend --no-edit  # Флаг --no-edit оставляет сообщение без изменений
  3. Изменить содержимое коммита (изменения/удаления файлов): Внесите необходимые правки в файлы, затем:

    git add .  # или конкретные файлы
    git commit --amend --no-edit

Как это работает технически: Git создает новый коммит, который включает все изменения из предыдущего коммита плюс ваши правки. Старый коммит удаляется из истории текущей ветки (но остается доступным по своему хешу какое-то время).

КРИТИЧЕСКИ ВАЖНОЕ ПРАВИЛО:

  • НЕ ИСПОЛЬЗУЙТЕ --amend для коммитов, которые уже были отправлены в общий удаленный репозиторий (git push).

Почему?

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

Безопасный workflow:

  1. Работайте в своей локальной ветке.
  2. Свободно используйте amend для «причесывания» локальной истории перед интеграцией.
  3. Только после этого делайте git push в общую ветку.

Альтернатива для исправления старых или опубликованных коммитов: Используйте интерактивный rebase (git rebase -i HEAD~n), но с той же осторожностью касательно уже отправленных коммитов.