git rebase — Перенос коммитов на новую базу
Команда git rebase берёт коммиты из одной ветки и воспроизводит их поверх другой. Она создаёт линейную историю без коммитов слияния.
Rebase vs Merge
Оба способа интегрируют изменения из одной ветки в другую, но работают по-разному:
Merge: Rebase:
A — B — C — M (main) A — B — C — D' — E' (main)
\ / (линейная история)
D — E (feature)
- Merge сохраняет все исходные коммиты и добавляет коммит слияния
- Rebase воспроизводит ваши коммиты поверх, создавая новые коммиты с теми же изменениями
Как это работает
До rebase:
A — B — C (main)
\
D — E (feature)
После git rebase main (из feature):
A — B — C (main)
\
D' — E' (feature)
Коммиты D' и E' содержат те же изменения, что и D и E, но это новые коммиты с новыми SHA — они были «воспроизведены» поверх C.
Основное использование
git checkout feature # Переключитесь на ветку, которую хотите перебазировать
git rebase main # Воспроизведите коммиты feature поверх main
Золотое правило
Никогда не перебазируйте коммиты, которые были отправлены в общую ветку. Rebase переписывает историю коммитов (создаёт новые SHA). Если другие основали свою работу на оригинальных коммитах, их переписывание вызовет путаницу и конфликты.
Безопасно перебазировать:
- Вашу локальную feature-ветку перед отправкой
- Вашу feature-ветку, над которой работаете только вы
Никогда не перебазируйте:
main,developили любую общую ветку- Коммиты, которые другие уже получили
Попробуйте!
Попрактикуйтесь в перебазировании feature-ветки на main:
- Создайте начальный коммит:
echo "base" > file.txt && git add file.txt && git commit -m "Initial commit"
- Создайте feature-ветку и переключитесь на неё:
git checkout -b feature
- Добавьте коммит в feature:
echo "feature work" > feature.txt && git add feature.txt && git commit -m "Add feature"
- Переключитесь на main и добавьте коммит:
git checkout mainecho "main update" >> file.txt && git add file.txt && git commit -m "Update main"
- Переключитесь на feature и перебазируйте на main:
git checkout featuregit rebase main
- Проверьте лог:
git log --oneline— ваш коммит feature теперь находится поверх последнего коммита main - Убедитесь, что изменения main включены:
cat file.txt— показывает "base" и "main update"
Разрешение конфликтов
Если Git не может чисто воспроизвести коммит, он приостанавливает rebase:
- Отредактируйте конфликтующие файлы для разрешения конфликтов
- Подготовьте разрешённые файлы:
git add <файл> - Продолжите rebase:
git rebase --continue
Чтобы прервать и вернуться к состоянию до rebase: git rebase --abort
Ключевые моменты
- Rebase воспроизводит коммиты на новой базе, создавая чистую линейную историю
- Он создаёт новые коммиты (новые SHA) — оригинальные коммиты заменяются
- Никогда не перебазируйте общие/публичные ветки — перебазируйте только свою локальную работу
- Используйте
git rebase --abortдля безопасной отмены выполняющегося rebase