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

Что такое squash в Git?

1.6 Junior🔥 161 комментариев
#Другое

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

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

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

Squash в Git

Squash в Git — это операция, которая объединяет несколько коммитов в один. Это полезно для чистоты истории коммитов, особенно при слиянии веток или подготовке pull request'ов. Вместо множества мелких промежуточных коммитов, вы получаете один логический коммит со всеми изменениями.

Когда нужен squash

  • Вы сделали много мелких коммитов ("fixed typo", "oops, forgot file", "another fix")
  • Готовитесь к merge в main ветку и хотите чистую историю
  • Хотите скрыть промежуточные ошибки от истории
  • Улучшаете читаемость git log

Способ 1: Interactive Rebase (самый распространённый)

# Просмотр последних коммитов
git log --oneline -n 5
# 5a8f3c2 Fix typo
# 4b2d1e1 Add logging
# 3c1f8a9 Refactor UserService
# 2d0e7b8 Add validation
# 1c9d6a7 Initial commit

# Squash последние 4 коммита
git rebase -i HEAD~4

Отворится редактор с примерно таким содержимым:

pick 2d0e7b8 Add validation
pick 3c1f8a9 Refactor UserService
pick 4b2d1e1 Add logging
pick 5a8f3c2 Fix typo

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

pick 2d0e7b8 Add validation
squash 3c1f8a9 Refactor UserService
squash 4b2d1e1 Add logging
squash 5a8f3c2 Fix typo

Сохраните файл (Ctrl+S в nano, :wq в vim). Git покажет экран для редактирования сообщения объединённого коммита:

# This is a combination of 4 commits.
# The first commit's message is:
Add validation

# The following are additional commits messages:
# Add validation
# Refactor UserService
# Add logging
# Fix typo

Отредактируйте сообщение на финальное:

Add validation and refactor UserService with logging

Сохраните — готово! Четыре коммита объединены в один.

Способ 2: Squash при merge

Это альтернативный подход — squash происходит во время слияния в main ветку:

# Находясь на ветке main
git merge --squash feature-branch

# Это создаст staged изменения, но не создаст коммит
# Вам нужно явно создать коммит
git commit -m "Merge feature: Add new authentication system"

Результат: все коммиты из feature-branch объединены в один коммит на main.

Способ 3: Squash в GitHub/GitLab

Соременные платформы предоставляют кнопку "Squash and merge" при слиянии pull request'а:

[Merge pull request] ▼
├── Merge commit (создаёт merge commit)
├── Squash and merge (объединяет все коммиты + создаёт merge commit)
└── Rebase and merge (перепроводит все коммиты)

Нажав "Squash and merge", все коммиты PR объединяются в один.

Пример: реальная ситуация

Сценарий: вы разрабатывали feature и сделали несколько коммитов:

git log --oneline feature-branch
# a5f3d2c Update tests
# b4e2c1b Fix bug in validator
# c3d1b0a Add new validator
# d2c0a9f Initial commit on feature

Без squash (если merge в main):

main:
├── Merge pull request #123
│   ├── a5f3d2c Update tests
│   ├── b4e2c1b Fix bug in validator
│   ├── c3d1b0a Add new validator
│   └── d2c0a9f Initial commit on feature
└── (previous commits)

С squash:

main:
├── x1y2z3a Add new validator with tests (объединённый коммит)
└── (previous commits)

Практический workflow с squash

# 1. Создаёте ветку
git checkout -b feature/user-auth

# 2. Разрабатываете, делаете много коммитов
git add . && git commit -m "Add JWT dependency"
git add . && git commit -m "Implement JWT provider"
git add . && git commit -m "Fix JWT expiration"
git add . && git commit -m "Add tests"

# 3. Перед merge, squash коммиты
git rebase -i main
# В редакторе: pick первый, squash остальные

# 4. Merge в main
git checkout main
git merge feature/user-auth
# История main остаётся чистой

Частые проблемы при squash

Проблема 1: Забыли отредактировать сообщение коммита

git rebase -i HEAD~3  # Запустите заново

Проблема 2: Произошёл конфликт при rebase

# 1. Разрешите конфликты вручную
# 2. Добавьте файлы
git add .

# 3. Продолжите rebase
git rebase --continue

# Или отмените всё
git rebase --abort

Проблема 3: Уже push'или коммиты

# После squash потребуется force push
git push origin feature-branch -f

# Будьте осторожны с force push на shared веток!

Squash vs другие опции rebase

# pick (p) — оставить коммит как есть
git rebase -i
# pick 123abc Message 1

# reword (r) — оставить коммит, но изменить сообщение
# reword 123abc Message 1

# squash (s) — объединить с предыдущим, сохранив сообщение
# squash 123abc Message 1

# fixup (f) — объединить с предыдущим, но отбросить сообщение
# fixup 123abc Message 1

# drop (d) — полностью удалить коммит
# drop 123abc Message 1

Лучшие практики

  • Squash перед merge на main ветку — поддерживает чистоту истории
  • Не squash'ьте, если несколько разработчиков используют вашу ветку
  • Force push осторожно — только на personal ветках
  • Информативные сообщения — после squash напишите понятное сообщение
  • Один feature = один коммит — squash помогает это достичь

Squash — это мощный инструмент для поддержания чистой и понятной истории Git репозитория.

Что такое squash в Git? | PrepBro