Ответ
git rebase — это команда для перезаписи истории коммитов. Она переносит цепочку коммитов из текущей ветки и применяет их поверх указанной базовой ветки, создавая линейную историю.
Основное использование:
-
Обновление feature-ветки:
# Находясь в ветке feature-branch git fetch origin # Получить свежие коммиты с удаленного репозитория git rebase origin/main # Перебазировать feature-branch на актуальный mainЭто переместит ваши коммиты на вершину
main, как если бы вы начали работу с самой последней версии. -
Интерактивное перебазирование (
-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-коммитов, которые как сопли на стекле — всем мешают смотреть.
Короче, как этим пользоваться, чтобы не обосраться:
-
Подтянуть свою ветку к свежей основной: Ты сидишь в своей
feature-branch, накодил, а ребята уже вmainнакидали изменений. Чтоб не отставать, делаешь так:git fetch origin # Тянешь свежак с сервера, не трогая свои файлы git rebase origin/main # И БАЦ! Твои коммиты летят на самый верх актуального mainПолучается, будто ты только что начал работу с самой свежей версии. Красота, ебать мои старые костыли!
-
Волшебная кнопка
-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, без лишних телодвижений!
Вот и вся наука. Сначала страшно, а потом привыкаешь и без этого жить не можешь. Главное — не путать, где можно хулиганить, а где уже пора вести себя прилично.