Тур по Git
История и отмена изменений / Урок 3.7

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:

  1. Создайте начальный коммит:
    • echo "base" > file.txt && git add file.txt && git commit -m "Initial commit"
  2. Создайте feature-ветку и переключитесь на неё:
    • git checkout -b feature
  3. Добавьте коммит в feature:
    • echo "feature work" > feature.txt && git add feature.txt && git commit -m "Add feature"
  4. Переключитесь на main и добавьте коммит:
    • git checkout main
    • echo "main update" >> file.txt && git add file.txt && git commit -m "Update main"
  5. Переключитесь на feature и перебазируйте на main:
    • git checkout feature
    • git rebase main
  6. Проверьте лог: git log --oneline — ваш коммит feature теперь находится поверх последнего коммита main
  7. Убедитесь, что изменения main включены: cat file.txt — показывает "base" и "main update"

Разрешение конфликтов

Если Git не может чисто воспроизвести коммит, он приостанавливает rebase:

  1. Отредактируйте конфликтующие файлы для разрешения конфликтов
  2. Подготовьте разрешённые файлы: git add <файл>
  3. Продолжите rebase: git rebase --continue

Чтобы прервать и вернуться к состоянию до rebase: git rebase --abort

Ключевые моменты

  • Rebase воспроизводит коммиты на новой базе, создавая чистую линейную историю
  • Он создаёт новые коммиты (новые SHA) — оригинальные коммиты заменяются
  • Никогда не перебазируйте общие/публичные ветки — перебазируйте только свою локальную работу
  • Используйте git rebase --abort для безопасной отмены выполняющегося rebase
🎯

Цель

Выполните rebase ветки feature на обновлённую ветку main

Terminal
$

No commits yet. Run `git init` and create your first commit.