Что делает команда `git rebase` и когда её использовать?

Ответ

git rebase — это команда для перезаписи истории коммитов. Она переносит цепочку коммитов из текущей ветки и применяет их поверх указанной базовой ветки, создавая линейную историю.

Основное использование:

  1. Обновление feature-ветки:

    # Находясь в ветке feature-branch
    git fetch origin          # Получить свежие коммиты с удаленного репозитория
    git rebase origin/main    # Перебазировать feature-branch на актуальный main

    Это переместит ваши коммиты на вершину main, как если бы вы начали работу с самой последней версии.

  2. Интерактивное перебазирование (-i): Позволяет редактировать историю коммитов перед их применением.

    git rebase -i HEAD~3  # Редактировать последние 3 коммита

    Откроется редактор, где можно:

    • pick — оставить коммит как есть.
    • squash — объединить коммит с предыдущим.
    • reword — изменить сообщение коммита.
    • edit — остановиться для внесения изменений в коммит.
    • drop — удалить коммит.

Преимущества перед git merge:

  • Чистая история: Избегает лишних merge-коммитов, история становится линейной и легко читаемой.
  • Упрощает навигацию: Легче следовать за развитием фичи в git log.

Критически важные правила:

  • НИКОГДА не перебазируйте коммиты, которые уже были отправлены в общий репозиторий (push). Это перезапишет историю для других разработчиков и вызовет конфликты.
  • Используйте rebase только для локальных коммитов в вашей приватной ветке.

Стандартный рабочий процесс:

git checkout -b my-feature  # Создать и перейти в feature-ветку
# ... делаем коммиты ...
git fetch origin
git rebase origin/main      # Обновить ветку относительно main
# Решить возможные конфликты, затем продолжить:
git rebase --continue
# Когда ветка готова, можно смержить через fast-forward:
git checkout main
git merge my-feature

Ответ 18+ 🔞

А, вот эта штука, про которую все говорят, а как доходит до дела — у половины команды глаза по пять рублей! git rebase, блядь. Ну, в двух словах, это как взять свою кучу коммитов и аккуратно, с пинцетом, переставить их на новое, свежее основание. Чтоб история была красивая, линейная, без этих ёбаных merge-коммитов, которые как сопли на стекле — всем мешают смотреть.

Короче, как этим пользоваться, чтобы не обосраться:

  1. Подтянуть свою ветку к свежей основной: Ты сидишь в своей feature-branch, накодил, а ребята уже в main накидали изменений. Чтоб не отставать, делаешь так:

    git fetch origin          # Тянешь свежак с сервера, не трогая свои файлы
    git rebase origin/main    # И БАЦ! Твои коммиты летят на самый верх актуального main

    Получается, будто ты только что начал работу с самой свежей версии. Красота, ебать мои старые костыли!

  2. Волшебная кнопка -i (интерактивный режим): Вот где начинается настоящая магия, а у кого-то и пиздец.

    git rebase -i HEAD~3  # Редактируешь последние 3 коммита

    Тебе откроется редактор, и тут можно творить, как на кухне у запойного повара:

    • pick — оставить коммит, не трогать.
    • squash — схлопнуть коммит с предыдущим. Идеально, когда ты накоммитил десять раз «пофиксил опечатку».
    • reword — поменять сообщение коммита. Вдруг там написано «ааа бля всё сломал»?
    • edit — остановиться, чтоб что-то допилить прямо в этом коммите. Опасная штука, но мощная.
    • drop — выкинуть коммит нахуй, будто его и не было.

А че лучше, чем merge? Да всё лучше, если не облажаться! История становится прямолинейной, как стрела, а не ветвистой, как ёлка после попойки. В git log не надо продираться сквозь дебри «Merge branch 'хуй пойми куда'». Чистота, блядь!

ГЛАВНОЕ ПРАВИЛО, КОТОРОЕ КРИЧАТЬ НА КАЖДОМ СТЕНДАПЕ:

НИКОГДА, БЛЯДЬ, НИ-КОГ-ДА не делай rebase для коммитов, которые уже улетели в общий репозиторий (которые ты уже pushнул). Это как прийти на общую кухню и переставить всем полки в холодильнике. Коллеги тебя возненавидят, история полетит к чертям, и во всём будет виноват ты. Используй эту силу только для своих, локальных, ещё никому не показанных коммитов.

Нормальный, не стрессовый процесс:

git checkout -b my-feature  # Отпочковался от main в свою песочницу
# ... пишешь код, коммитишь как сумасшедший ...
git fetch origin
git rebase origin/main      # Подтягиваешь свежий main под себя
# Если вылез конфликт — не паникуй, реши его, потом:
git rebase --continue
# Когда фича готова и история причёсана, вливаешь обратно в main:
git checkout main
git merge my-feature        # И тут сработает fast-forward, без лишних телодвижений!

Вот и вся наука. Сначала страшно, а потом привыкаешь и без этого жить не можешь. Главное — не путать, где можно хулиганить, а где уже пора вести себя прилично.