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

Что делает команда git rebase -i?

1.0 Junior🔥 71 комментариев
#FastAPI и Flask

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

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

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

git rebase -i: Interactive Rebase

Краткий ответ

git rebase -i (interactive rebase) — это команда для интерактивного переписывания истории коммитов. Она позволяет редактировать, переупорядочивать, объединять или удалять коммиты перед тем, как переместить их на другую ветку.

Синтаксис и базовое использование

# Interactive rebase последних 3 коммитов
git rebase -i HEAD~3

# Interactive rebase всех коммитов после ветки main
git rebase -i main

# Interactive rebase коммитов с определённого момента
git rebase -i abc1234

Что происходит

Когда ты выполняешь git rebase -i HEAD~3, Git открывает редактор со списком последних 3 коммитов:

pick 1a2b3c Fix bug in login
pick 2c3d4e Add new feature
pick 3d4e5f Update documentation

# Rebase abc1234..3d4e5f onto abc1234 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
# l, label = label current HEAD with a name
# t, reset = reset HEAD to a label
# m, merge = create a merge commit using the original merge commit's
#            message (or the oneline, if no original merge commit was
#            specified). Use -C <commit> to reuse the commit message.

Операции Interactive Rebase

1. pick (p) — Использовать коммит как есть

pick 1a2b3c Fix bug in login
pick 2c3d4e Add new feature

# Коммиты останутся в том же порядке и без изменений

2. reword (r) — Изменить сообщение коммита

reword 1a2b3c Fix bug in login
pick 2c3d4e Add new feature

# Git остановится на первом коммите, позволит отредактировать сообщение
# Затем продолжит с остальными

3. squash (s) — Объединить с предыдущим коммитом

# История до rebase:
# pick 1a2b3c Add user model
# pick 2c3d4e Fix typo in user model
# pick 3d4e5f Add validation

# Команда rebase -i:
pick 1a2b3c Add user model
squash 2c3d4e Fix typo in user model
pick 3d4e5f Add validation

# Результат: 2 коммита
# 1a2b3c Add user model (+ fixes)
# 3d4e5f Add validation

Практический пример:

# Git откроет редактор с сообщениями обоих коммитов
# Ты можешь отредактировать объединённое сообщение:

Add user model

Fix typo in user model

# После сохранения, 2 коммита объединятся в 1

4. fixup (f) — Объединить, отбросив сообщение

pick 1a2b3c Add user model
fixup 2c3d4e Fix typo
pick 3d4e5f Add validation

# Коммиты объединяются, но сообщение второго отбрасывается
# Результат: только сообщение первого коммита

5. edit (e) — Остановиться на коммите для изменения

edit 1a2b3c Add user model
pick 2c3d4e Add new feature

# Git остановится на коммите 1a2b3c
# Можешь:
# - Добавить/удалить файлы
# - Отредактировать код
# - Сделать новые коммиты
# - После завершения: git rebase --continue

6. drop (d) — Удалить коммит

pick 1a2b3c Fix bug
drop 2c3d4e Temporary debug code
pick 3d4e5f Feature

# Второй коммит будет полностью удалён из истории

7. exec (x) — Запустить команду

pick 1a2b3c Add feature
exec npm test
pick 2c3d4e Refactor

# После first коммита автоматически запустится npm test
# Если тест упадёт, rebase остановится

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

Пример 1: Очистить историю перед мержем

# У тебя есть ветка с грязной историей:
# abc1234 WIP: trying approach
# bcd2345 Fix mistake
# cde3456 Add feature (real commit)
# def4567 Add tests

# Команда:
git rebase -i main

# Редактируешь:
pick abc1234 WIP: trying approach
squash bcd2345 Fix mistake
pick cde3456 Add feature
pick def4567 Add tests

# Результат: 3 чистых коммита вместо 4

Пример 2: Переупорядочить коммиты

# Было:
pick 1a2b3c Add database connection
pick 2c3d4e Add validation
pick 3d4e5f Add tests for validation

# Хочешь чтобы тесты были рядом с фичей:
pick 1a2b3c Add database connection
pick 3d4e5f Add tests for validation
pick 2c3d4e Add validation

# Просто переместишь строки

Пример 3: Разбить большой коммит

# Был большой коммит с несколькими независимыми изменениями
git rebase -i HEAD~1

# Выбираешь edit:
edit abc1234 Refactor and add feature

# Git остановится, ты можешь:
git reset HEAD~1
# Теперь все изменения unstaged

# Добавляешь части по отдельности:
git add refactoring/
git commit -m "Refactor code"

git add feature/
git commit -m "Add feature"

# Продолжаешь rebase:
git rebase --continue

Важные моменты

1. Никогда не используй rebase -i на публичных ветках

# Опасно!
git rebase -i origin/main
# Затем пушишь force
git push -f

# Это переписывает историю для всех
# Коллеги будут очень недовольны

# Правильно: используй rebase -i только на локальных ветках
# Перед тем как запушить

2. Отмена rebase

Если что-то пошло не так:

# Git сохраняет original HEAD в ORIG_HEAD
git rebase --abort    # Отменить весь rebase

# Или вернуться к предыдущему состоянию
git reset --hard ORIG_HEAD

# Или использовать reflog
git reflog
git reset --hard abc1234

3. Конфликты при rebase

# Если во время rebase возникают конфликты:
# 1. Исправляешь конфликты в файлах
# 2. git add .
# 3. git rebase --continue

# Или:
git rebase --skip      # Пропустить этот коммит
git rebase --abort     # Отменить весь rebase

Альтернативы

Merge вместо Rebase

# Более безопасный способ объединить ветки
git merge main

# Плюсы merge:
# - Сохраняет полную историю
# - Безопаснее для публичных ветвей

# Минусы:
# - История становится более запутанной
# - Много merge commits

Squash Merge

# Объединить все коммиты в 1
git merge --squash feature
git commit -m "Merge feature branch"

# Результат: весь функционал в одном коммите

Правила использования

rebase_rules = {
    "Используй rebase -i для": [
        "Очистки локальной истории перед пушем",
        "Объединения черновиков",
        "Переупорядочивания коммитов",
        "Редактирования сообщений",
    ],
    "Не используй rebase -i для": [
        "Переписывания публичной истории",
        "Совместной работы (используй merge)",
        "Когда не уверен в последствиях",
    ],
    "Основной workflow": [
        "Работаешь в своей ветке",
        "git rebase -i для очистки истории",
        "git rebase main для обновления от основной ветки",
        "git push (обычный push, не force)",
    ]
}

Вывод: git rebase -i — это мощный инструмент для переписывания истории коммитов. Используй его для очистки локальной истории перед sharing кода с командой, но НИКОГДА не переписывай публичную историю.