Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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 кода с командой, но НИКОГДА не переписывай публичную историю.