что такое ребейс в гите

Git Rebase: руководство по использованию

Rebase — один из двух способов объединить изменения, сделанные в одной ветке, с другой веткой. Начинающие и даже опытные пользователи git иногда испытывают нежелание пользоваться ей, так как не видят смысла осваивать еще один способ объединять изменения, когда уже и так прекрасно владеют операцией merge. В этой статье я бы хотел подробно разобрать теорию и практику использования rebase.

Теория

Итак, освежим теоретические знания о том, что же такое rebase. Для начала вкратце — у вас есть две ветки — master и feature, обе локальные, feature была создана от master в состоянии A и содержит в себе коммиты C, D и E. В ветку master после отделения от нее ветки feature был сделан 1 коммит B.

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

После применения операции rebase master в ветке feature, дерево коммитов будет иметь вид:

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Обратите внимание, что коммиты C’, D’ и E’ — не равны C, D и E, они имеют другие хеши, но изменения (дельты), которые они в себе несут, в идеале точно такие же. Отличие в коммитах обусловлено тем, что они имеют другую базу (в первом случае — A, во втором — B), отличия в дельтах, если они есть, обусловлены разрешением конфликтных ситуаций, возникших при rebase. Об этом чуть подробнее далее.

Такое состояние имеет одно важное преимущество перед первым, при слиянии ветки feature в master ветка может быть объединена по fast-forward, что исключает возникновение конфликтов при выполнении этой операции, кроме того, код в ветке feature более актуален, так как учитывает изменения сделанные в ветке master в коммите B.

Процесс rebase-а детально

Давайте теперь разберемся с механикой этого процесса, как именно дерево 1 превратилось в дерево 2?

Напомню, перед rebase вы находтесь в ветке feature, то есть ваш HEAD смотрит на указатель feature, который в свою очередь смотрит на коммит E. Идентификатор ветки master вы передаете в команду как аргумент:

Для начала git находит базовый коммит — общий родитель этих двух состояний. В данном случае это коммит A. Далее двигаясь в направлении вашего текущего HEAD git вычисляет разницу для каждой пары коммитов, на первом шаге между A и С, назовем ее ΔAC. Эта дельта применяется к текущему состоянию ветки master. Если при этом не возникает конфликтное состояние, создается коммит C’, таким образом C’ = B + ΔAC. Ветки master и feature при этом не смещаются, однако, HEAD перемещается на новый коммит (C’), приводя ваш репозитарий состояние «отделеной головы» (detached HEAD).

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Успешно создав коммит C’, git переходит к переносу следующих изменений — ΔCD. Предположим, что при наложении этих изменний на коммит C’ возник конфликт. Процесс rebase останавливается (именно в этот момент, набрав git status вы можете обнаружить, что находитесь в состоянии detached HEAD). Изменения, внесенные ΔCD находятся в вашей рабочей копии и (кроме конфликтных) подготовлены к коммиту (пунктиром обозначена stage-зона):

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Далее вы можете предпринять следующие шаги:

1. Отменить процесс rebase набрав в консоли

При этом маркер HEAD, будет перенесен обратно на ветку feature, а уже добавленные коммиты повиснут в воздухе (на них не будет указывать ни один указатель) и будут вскоре удалены.

При этом, если все конфликты действительно разрешены, будет создан коммит D’ и rebase перейдет к следующему, в данном примере последнему шагу.

После применения изменений ΔDE будет создан последний коммит E’, указатель ветки feature будет установлен на коммит E’, а HEAD станет показывать на ветку feature — теперь, вы находитесь в состоянии на втором рисунке, rebase окончен. Старые коммиты C, D и E вам больше не нужны.

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

При этом коммиты, созданные в процессе rebase-а, будут содержать данные как об оригинальном авторе и дате изменений (Author), так и о пользователе, сделавшем rebase (Commiter):

С небес на землю — rebase в реальных условиях

На самом деле обычно вы работаете не с двумя ветками, а с четырьмя в самом простом случае: master, origin/master, feature и origin/feature. При этом rebase возможен как между веткой и ее origin-ом, например feature и origin/feature, так и между локальными ветками feature и master.

Rebase ветки с origin-ом

Если вы хотите начать работать с rebase, то лучше всего начать с ребейза своих изменений в ветке относительно ее копии в удаленном репозитарии. Дело в том, что когда вы добавляете коммит, и в удаленном репозитарии добавляется коммит, для объединения изменений по-умолчанию используется merge. Выглядит это примерно так:

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Три коммита превратились в 6 (базовый коммит не считаем), история изменений неоправдано запутана, информация об объединении локальных веток с удаленными, на мой взгляд, лишняя. Если масштабировать эту ситуацию на несколько тематических веток и большее количество разработчиков, граф может выглядеть, например, так:

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Как поделиться веткой, к которой применен rebase, с коллегой

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Тут все просто, наберите в консоли команду:

Force-режим просто копирует отсутствующие родительские коммиты ветки feature на origin и насильно устанавливает указатель ветки на тот же коммит, что и ваш локальный.

Будьте внимательны! Если вы забудете указать идентификатор ветки, то force-push будет выполнен для всех локальных веток, имеющих удаленный оригинал. При этом нужно понимать, что некоторые локальные ветки могут быть в неактуальном состоянии. То есть измененения, которые вы не успели затянуть будут удалены в origin-е. Конечно, сами коммиты не будут удалены — сбросятся только указатели ветки. Эта ситуация поправима — достаточно для каждой ветки найти человека, который последним пушил изменения в нее или уже успел их забрать. Он может сделать обычный push, вновь передав их на origin. Но вся эта морока вам ни к чему, так что лучше просто будьте внимательны.

Реинтеграция тематической ветки в master

Мы рассмотрели все необходимые операции для работы с ветками в стиле rebase. Осталось только переключиться в ветку master и сделать git merge feature. Ветка, подготовленная rebase-ом вольется в master по fast-forward, то есть указатель будет просто перемещен вперед.

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

В данном случае, на мой взгляд, merge-коммиты полезны и несут в себе информацию о моменте объединения веток. Этот граф выглядит как учебный пример, но такая структура вполне реальна при соблюдении некоторых простых правил всеми членами команды.

Заключение

Мы видим, что читаемость графа изменений может быть улучшена на порядок при соблюдении нескольких простых правил, хотя они и требуют небольших дополнительных временных затрат.

В данной статье сделано одно допущение. Все это верно при простой модели ветвления — есть одна главная ветка master и несколько тематических, которые создаются от нее. Когда от тематической ветки создается другая тематическая ветка, есть свои нюансы при rebase-е первичной и вторичной ветки. О них можно прочитать в том самом официальном руководстве.

Иногда споры, что же лучше merge или rebase доходят до холивара. От себя могу сказать, что в конечном счете выбор за вами, однако этот выбор не может быть продиктован уровнем владения тем или иным инструментом. Обоснованный выбор можно сделать, только когда для вас не составит труда работать и в том и в другом стиле. Я не агитирую за повсеместное использование rebase-а, а просто объясняю как им пользоваться. Надеюсь, это статья поможет вам снять вопросы, связанные с механизмом работы rebase и его применением в ежедневной работе.

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

Источник

Введение в Git Merge и Git Rebase: зачем и когда их использовать

Часто у разработчиков возникает выбор между Merge (слияние) и Rebase (перемещение). В Гугле вы увидите разное мнение, многие советуют не использовать Rebase, так как это может вызвать серьезные проблемы. В статье я объясню, что такое слияние и перемещение, почему вы должны (или не должны) использовать их и как это сделать.

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Git Merge и Git Rebase преследуют одну и ту же цель. Они предназначены для интеграции изменений из одной ветки в другую. Хотя конечная цель одинаковая, принципы работы разные.

Некоторые считают, что вы всегда должны использовать Rebase, другие предпочитают Merge. В этом есть свои плюсы и минусы.

Git Merge

Слияние — обычная практика для разработчиков, использующих системы контроля версий. Независимо от того, созданы ли ветки для тестирования, исправления ошибок или по другим причинам, слияние фиксирует изменения в другом месте. Слияние принимает содержимое ветки источника и объединяет их с целевой веткой. В этом процессе изменяется только целевая ветка. История исходных веток остается неизменной.
что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите
Плюсы:

Слейте ветку master в ветку feature, используя команды checkout и merge.

Это создаст новый «Merge commit» в ветке feature, который содержит историю обеих веток.

Git Rebase

Rebase — еще один способ перенести изменения из одной ветки в другую. Rebase сжимает все изменения в один «патч». Затем он интегрирует патч в целевую ветку.

В отличие от слияния, перемещение перезаписывает историю, потому что она передает завершенную работу из одной ветки в другую. В процессе устраняется нежелательная история.

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Переместите ветку feature на главной ветке, используя следующие команды.

Это перемещает всю ветку функции в главную ветку. История проекта изменяется, создаются новые коммиты для каждого коммита в основной ветке.

Интерактивное перемещение

Это позволяет изменять коммиты при их перемещении в новую ветку. Это лучше, чем автоматическое перемещение, поскольку обеспечивает полный контроль над историей коммитов. Как правило, используется для очистки истории до слияния ветки feature в master.

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

Это точно определяет, как будет выглядеть ветка после выполнения перемещения. Упорядочивая объекты, вы можете сделать историю такой, как захотите. Вы можете использовать команды fixup, squash, edit, и так далее.

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Какой из них использовать?

Так что же лучше? Что рекомендуют эксперты?

Трудно принять единственно правильное решение о том, что лучше использовать, поскольку все команды разные. Всё зависит от потребностей и традиций внутри команды.

Принимайте решения на основании компетенции команды в Git. Для вас важна простота или перезаписывание истории, а может быть что-то другое?

По мере роста команды становится сложно управлять или отслеживать изменения в разработке, применяя слияние. Чтобы иметь чистую и понятную историю коммитов, разумно использовать Rebase.

Источник

Простое объяснение Git Rebase

Перевод статьи «Git Rebase Explained Simply».

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Rebase, пожалуй, самая недопонятая команда git. Практически каждый разработчик-джуниор, с которым мне довелось работать в паре, боялся применять git rebase.

Забавно, но rebase это одна из нескольких команд git, которыми я лично пользуюсь практически ежедневно. По большому счету, я делаю rebase по крайней мере единожды для каждого пул-реквеста на GitHub.

Применение rebase помогает мне удостовериться, что мои сообщения коммитов имеют смысл и что мои ветки не вызовут каких-то серьезных и неожиданных конфликтов слияния.

Использование команды git rebase перестанет быть чем-то сложным или пугающим, как только вы поймете, как она работает и чем полезна.

Итак, представьте, что у вас есть две ветки.

Первая выглядит так:

Если присмотреться, можно заметить, что вплоть до 13363dd3 основа веток (base) одинакова, а дальше они расходятся.

Первая ветка, которую мы будем считать нашей рабочей веткой, содержит три коммита, которых нет во второй ветке.

Вторая ветка (в нашем примере — master) содержит восемь коммитов, не имеющихся в нашей рабочей ветке.

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

Допустим, вы занимаетесь разработкой какой-нибудь отдельной фичи и делаете это в отдельной ветке. Если эта ваша ветка просуществует хотя бы несколько дней, скорее всего за это время ветка master успеет измениться (т. е., еще до того, как вы вольете свою ветку обратно в master).

В таком случае очень пригодилась бы возможность сначала привести свою ветку в соответствие с master, а уж затем добавить свои изменения на верхушку git history.

Если мы «уравняем» нашу рабочую ветку с веткой master в ее теперешнем состоянии, а затем поместим три своих коммита сверху, мы получим следующую историю:

Таким образом пул-реквест в master будет куда чище, кроме того, это поможет избежать конфликтов слияния.

К счастью, все это возможно благодаря перебазированию ветки!

Давайте обратим внимание на само название команды: Rebase. Что оно означает?

Применяя эту команду, мы заменяем основу (базу) нашей рабочей ветки на на ветку master. Т.е., мы «перебазируем» («re-base») рабочую ветку, меняем ее основу.

Использование git rebase

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Давайте теперь познакомимся поближе с самой командой.

Предположим, у нас есть working-branch (рабочая ветка), проверенная на нашей локальной машине. В таком случае rebase выглядит просто:

Вы увидите в консоли некий output:

Как мы видим, git заново «проигрывает» нашу работу, как своего рода музыкальную запись, сверху ветки master.

Если вывести лог истории git, вы увидите, что наши изменения записаны поверх ветки master.

То есть, мы «перебазировали» нашу ветку, заменив ее основу на ветку master.

Если использование rebase все еще пугает вас, попробуйте делать копию своей рабочей ветки, прежде чем запускать команду rebase — просто на всякий случай!

Источник

Поддержание аккуратной истории в Git с помощью интерактивного rebase

Прим. перев.: эта статья была написана автором Git-клиента Tower, Tobias Günther, и опубликована в блоге GitLab. В ней просто и наглядно рассказывается об основных возможностях интерактивного rebase’а, что может стать отличным введением для тех, кто только начинает им пользоваться.

Interactive rebase — один из самых универсальных инструментов Git’а. В этой статье мы поговорим о том, как с его помощью корректировать сообщения при коммитах, исправлять ошибки, и о многом другом.

Интерактивный rebase иногда называют «швейцарским армейским ножом» Git’а, поскольку он объединяет в себе так много различных инструментов для совершенно разных сценариев применения. При этом главным вариантом использования, без сомнения, является очистка локальной истории коммитов.

Обратите внимание на слово «локальной»: rebase следует использовать только для очистки локальной истории коммитов (например, перед включением одной из ваших локальных feature-веток в общую ветку команды). И наоборот, этот мощный инструмент НЕ следует использовать для исправления коммитов в ветке, которая уже загружена и открыта для совместной работы в удаленном репозитории. Интерактивный rebase — инструмент для «переписывания» истории Git, и его не следует использовать для редактирования коммитов, которые уже открыты для других.

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

Примечание: для визуализации сценариев и последовательностей операций для некоторых скриншотов я использовал GUI к Git под названием Tower.

Редактирование сообщения в старом коммите

Вот пример описания к коммиту, которое мы будем исправлять:

«Плохое» сообщение к коммиту, которое мы будем исправлять

Первый шаг при использовании interactive rebase — определить, какой частью истории мы собираемся манипулировать. В примере выше для того, чтобы изменить «плохое» коммит-сообщение, мы должны начать с его родительского коммита.

Начинаем с родительского коммита

Теперь нужно скормить хэш родительского коммита команде:

Откроется окно редактора со списком коммитов для изменения. Не удивляйтесь тому, что они приведены в обратном порядке: в рамках интерактивного rebase’а Git будет повторно применять прошлые коммиты один за другим. Другими словами, с точки зрения Git коммиты выстроены в правильном порядке.

Окно редактора со списком выбранных коммитов

Редактирование описания старого коммита

Сохраните изменения и закройте окно. Поздравляю — сессия интерактивного rebase’а завершена, сообщение к коммиту успешно отредактировано!

Объединение нескольких коммитов в один

Rebase также можно использовать для объединения нескольких старых коммитов в один. При этом, конечно, актуальным остается золотое правило систем управления версиями: в большинстве случаев лучше создавать множество мелких коммитов, нежели несколько крупных. Однако, как и во всем остальном, мы можем внезапно обнаружить, что несколько перестарались со следованием этому правилу, и решить, что было бы хорошо объединить несколько старых коммитов в один.

Давайте предположим, что нужно объединить следующие выбранные коммиты в один:

Объединяем несколько коммитов в один

Как и в первом случае, процесс начинается с запуска сессии интерактивного rebase’а на коммите-предшественнике тех, что мы хотим изменить.

Снова откроется окно редактора с историей коммитов, которые мы хотим объединить:

Помечаем нужные строки кодовым словом «squash»

Сохраните изменения и закройте окно редактора. Как и в первом случае, появится новое окно с просьбой ввести сообщение для нового, объединенного коммита:

Вводим сообщение для нового коммита

Сохраните сообщение и закройте окно. Будет создан новый коммит, содержащий изменения обоих старых коммитов. Вуаля!

Исправление ошибок

Interactive rebase отлично подходит для исправления ошибок в предыдущих коммитах. При этом не имеет значения, какая именно это ошибка: забыли ли вы внести определенное изменение, должны ли были удалить файл, или просто опечатались…

Обычное решение в подобной ситуации — просто сделать новый коммит, исправляющий ошибку. Но с другой стороны, это внесет дополнительную путаницу в историю: сначала у нас оригинальный коммит, затем мы добавили еще один, исправляющий ошибки… в общем, не слишком «чистый» рабочий подход. Очень скоро в истории коммитов станет нелегко разобраться, поскольку она будет забита всеми этими исправлениями/заплатками.

Как работает fixup

После этого все будет выглядеть так, словно с оригинальным коммитом не было никаких проблем! Итак, давайте изучим весь процесс на практическом примере.

Прежде всего необходимо исправить проблему: добавить новый файл, внести изменения в существующий, удалить устаревшие файлы. Другими словами, внести изменения, исправляющие ошибку.

$ git add corrections.txt

Если теперь посмотреть на историю, вы увидите, что был создан ничем не примечательный коммит (разве вы ожидали чего-то иного?). Но при более внимательном взгляде становятся заметны некоторые особенности: к новому коммиту были автоматически добавлены пометка «fixup!» и описание старого «плохого» коммита:

Оригинальный коммит и корректирующий коммит (fixup)

Теперь пора запускать interactive rebase. Опять же, в качестве отправной точки выбираем коммит, предшествующий «плохому»:

Корректирующий коммит помечен как «fixup» и размещен в правильном порядке

Git автоматически сделал две вещи:

И переупорядочил строки так, чтобы fixup-коммит оказался непосредственно под «плохим» коммитом. Дело в том, что fixup работает в точности как squash : он объединяет выделенный коммит с коммитом выше.

Таким образом, нам ничего делать не надо. Сохраните изменения и закройте окно редактора.

Давайте еще раз взглянем на историю коммитов:

Мало того, что оригинальный коммит теперь содержит правки из вспомогательного, но и некрасивый вспомогательный коммит (с исправлениями) исчез из истории. Все красиво, словно никогда и не было никаких проблем!

Откройте для себя возможности interactive rebase

Существует множество различных вариантов использования интерактивного rebase’а: большинство из них связаны с исправлением ошибок. Подробнее узнать о других способах можно в бесплатном (англоязычном) курсе «First Aid Kit for Git» — коллекции коротких видео (по 2-3 минуты на эпизод).

Источник

Золотое правило git rebase

Мы тут немного переделали наш курс посвящённый web-разработке и добавили ещё целый месяц изучения JS. Ну и как обычно у нас — рассмотрим что-нибудь интересное, что разбирается у нас на курсе. В данном случае — git rebase.

Что на самом деле происходит во время git rebase, и почему вас должно это волновать.

Таким вы могли бы представить себе rebase в git:

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Вы могли бы подумать, что когда вы делаете rebase, вы «отсоедините» ветвь, которую хотите перебазировать, и «присоедините» ее к концу другой ветви. Это не очень далеко от истины, но стоит копнуть немного глубже. Вот что написано в документации про rebase:

“git-rebase: Forward-port local commits to the updated upstream head”— документация git

Не очень полезно, не так ли? Примерный перевод (и перевод перевода) может быть таким:

git-rebase: Переприменить (reapply) все коммиты из вашей ветки к концу другой ветки.

Самое важное слово здесь — «переприменить (reapply)», потому что rebase — это не просто ctrl-x/ctrl-v от одной ветки к другой. Rebase будет последовательно брать все коммиты из ветки, в которой вы находитесь, и повторно применять их к другой ветке. Это имеет два важных последствия:

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Как вы можете видеть, ветвь feature имеет совершенно новые коммиты. Как уже было сказано, она имеет такой же набор изменений, но совершенно разные объекты с точки зрения git. И вы также можете видеть, что предыдущие коммиты не уничтожены. Они просто не доступны напрямую. Если вы помните, ветка является только указателем на коммиты. Поэтому, если ни ветви, ни теги не указывают на коммиты, становится почти невозможно их достать, но коммиты все еще существуют.

Теперь давайте поговорим о знаменитом золотом правиле.

Золотое правило rebase-а

«Не следует делать rebase общей ветки» — Все и каждый о rebase

Вы, вероятно, уже сталкивались с этим правилом, возможно, сформулированном по-другому. Для тех, кому не довелось, это правило довольно простое. Никогда, НИКОГДА, НИКОГДА не делайте rebase общей ветки. Под общей веткой я подразумеваю ветку, которая существует в удаленном репозитории и которую другие люди из вашей команды могут запулить себе.

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

Для этого давайте представим себе ситуацию, когда разработчик нарушает это правило, и посмотрим, что произойдет.

Скажем, Боб и Анна работают над одним и тем же проектом. Вот репозиторий Боба, Анны, и удаленный репозиторий на GitHub:

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Все синхронизируются с удаленным репозиторием (GitHub)

Теперь Боб, невинно нарушает золотое правило rebase-а, в это же время Анна решает поработать над этой фичей и создает новый коммит:

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Догадываетесь, что произойдет?

Боб пытается запушить, он получает отказ и видит такое сообщение:

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите
Oh My Zsh с темой agnoster для тех, кому интересно.

Git не доволен, потому что он не знает, как объединить ветку feature Bob с веткой feature GitHub. Обычно, когда вы пушите свою ветку на удаленный репозиторий, git объединяет ветку, которую вы пытаетесь запушить с ветвью, находящейся в удаленном репозитории. Если быть точным, git пытается перемотать(fast-forward) вашу ветку, и мы поговорим об этом в будущем посте. Что вы должны запомнить, так это то, что удаленный репозиторий не может, простым способом, справиться с перебазированной веткой, которую Боб пытается запушить.

Одним из решений для Боба было бы сделать git push-force, который сообщает удаленному репозиторию:
“Don’t try to merge or do whatever work between what I push and what you already have. Erase your version of the feature branch, what I push is now the new feature branch”
And this is what we end up with:
“Не пытайся объединять или делать какую-либо другую работу между тем, что я пушу, и тем, что у тебя уже есть. Сотри свою версию ветки feature: то, что я пушу, теперь является новой веткой feature”

И это то, что мы получаем:

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Если бы Анна знала, что произойдет, она не пошла бы на работу этим утром.

Теперь Анна хочет запушить ее изменения:

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Это нормально, git просто сказал Анне, что у нее нет синхронизированной версии ветки feature, т.е. ее версия ветки и версия ветки GitHub разные. Естественно, Анна пулит. Точно так же, как git пытается объединить вашу локальную ветку с тем, что находится в удаленном репозитории при пуше, git пытается объединить то, что находится в удаленном репозитории, с тем, что находится в вашей локальной ветви, когда вы пулите.

Так выглядят коммиты в удаленной и локальной feature перед пулом:

Когда вы пулите, git должен выполнить слияние, чтобы разрешить эту проблему. И вот что происходит:

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Коммит M представляет собой мерж-коммит — коммит, в котором наконец-то воссоединились ветка Анны и GitHub-а. Анна, наконец, вздыхает с облегчением, ей удалось разрешить все конфликты слияния, и теперь она может запушить свою работу. Боб решает запулить, и теперь все синхронизированы.

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите

Одного взгляда на этот беспорядок, должно быть достаточно, чтобы убедить вас в справедливости золотого правила. Вы должны иметь в виду, что вы находитесь перед беспорядком, созданным только одним человеком, в ветке, совместно используемой только двумя людьми. Представьте, что вы делаете это с командой из 10 человек. Одна из многочисленных причин, по которой люди используют git, состоит в том, что вы можете легко “вернуться назад во времени”, но чем более беспорядочна ваша история, тем сложнее это становится.

Вы также можете заметить дублирующиеся коммиты в репозитории — D и D’, которые имеют одинаковый набор изменений. Количество дублированных коммитов может быть таким же большим, как количество коммитов внутри вашей перебазированной ветки.

Если вы все еще не уверены, попробуйте представить Эмму, третьего разработчика. Она работала на feature еще до того, как Боб все испортил, и теперь хочет запушить изменения. Обратите внимание, что она пушит после нашего предыдущего мини-сценария.

что такое ребейс в гите. Смотреть фото что такое ребейс в гите. Смотреть картинку что такое ребейс в гите. Картинка про что такое ребейс в гите. Фото что такое ребейс в гите
черт возьми, Боб!

update: Как заметил один reddit-юзер, этот пост может заставить вас думать, что rebase можно использовать только для перебазирования ветки в верхнюю часть другой ветки. Это не так, вы можете перебазировать одну и ту же ветку, но это уже другая история.

Спасибо за внимание.

Как всегда ждём ваши вопросы, комментарии тут или на можно помучать преподавателей на открытом уроке.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *