← Назад к вопросам

В чем разница между amend и squash?

2.0 Middle🔥 121 комментариев
#Инструменты и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между amend и squash в git

Amend и squash — это два разных подхода к редактированию истории коммитов в git. Хотя оба инструмента позволяют изменять коммиты, они используются в разных сценариях и работают по-разному.

Что такое amend?

Amend — это команда для редактирования последнего (самого свежего) коммита в текущей ветке. Она позволяет:

  • Добавить забытые файлы к последнему коммиту
  • Изменить сообщение последнего коммита
  • Изменить содержимое последнего коммита
# Изменить только сообщение
git commit --amend -m "Новое сообщение"

# Добавить забытый файл к последнему коммиту
git add забытый_файл
git commit --amend

# Без изменения сообщения
git commit --amend --no-edit

Важно: amend переписывает последний коммит, создавая новый коммит с другим хеш-кодом. Если вы уже отправили коммит в удалённый репозиторий, то после amend придётся делать force push (что может вызвать конфликты у других разработчиков).

Что такое squash?

Squash — это операция объединения нескольких коммитов в один. Её используют для:

  • Очистки истории перед слиянием pull request
  • Группировки связанных коммитов в логические блоки
  • Удаления промежуточных коммитов отладки

Squash обычно используется с интерактивным rebase:

# Интерактивный rebase для последних 3 коммитов
git rebase -i HEAD~3

В редакторе вы увидите:

pick abc1234 Первый коммит
pick def5678 Второй коммит
pick ghi9012 Третий коммит

Чтобы объединить коммиты, замените pick на squash (или s) для всех, кроме первого:

pick abc1234 Первый коммит
squash def5678 Второй коммит
squash ghi9012 Третий коммит

После этого вам предложат объединить сообщения коммитов в одно.

Ключевые различия

ХарактеристикаAmendSquash
Количество коммитовРедактирует только последнийОбъединяет несколько в один
ИсторияПереписывает 1 коммитПереписывает несколько коммитов
СложностьПростая командаТребует интерактивного rebase
Области примененияБыстрое исправление последнего коммитаПодготовка к merge PR, очистка истории
Когда использоватьЗабыли добавить файл или опечатка в сообщенииНесколько коммитов, связанные с одной фичей

Практические примеры

Пример 1: Amend для забытого файла

# Вы только что сделали коммит
git commit -m "Добавил функцию авторизации"

# Но забыли добавить файл config.js
git add src/config.js
git commit --amend --no-edit

# Теперь config.js в том же коммите

Пример 2: Squash перед pull request

# У вас есть ветка с 5 коммитами
git log --oneline
# abc1234 Fix linter warning
# def5678 Add API integration
# ghi9012 WIP: refactor
# jkl3456 Complete refactoring
# mno5678 Add tests

# Делаете интерактивный rebase
git rebase -i HEAD~5

# Объединяете в 1 логический коммит
# Результат: 1 чистый коммит с сообщением "Add API integration with tests"

Когда использовать что?

Используй amend когда:

  • Нужно исправить последний коммит (забыли файл, опечатка в сообщении)
  • Вы работаете локально и не отправили коммит на сервер
  • Требуется быстрое исправление

Используй squash когда:

  • Готовите ветку для слияния с main/master
  • Хотите очистить историю от промежуточных коммитов
  • Несколько коммитов логически связаны и должны быть одной единицей
  • Хотите сделать историю понятнее для других разработчиков

Опасность переписывания истории

Оба этих инструмента переписывают историю коммитов. Золотое правило: не переписывайте историю коммитов, которые уже были отправлены в shared ветку (main, develop и т.п.), так как это может создать конфликты для других разработчиков.

Amemd и squash безопасны только для:

  • Локальных веток перед первым push
  • Feature веток перед pull request

После push в shared репозиторий используйте git revert для отмены изменений вместо переписывания истории.

В чем разница между amend и squash? | PrepBro