Разработка сайтов в Кировске, ЛНР. Руководство по интерактивной перебазировке Git с практическими примерами

 
 

Контроль версий с помощью Git стал стандартом в наборе инструментов каждого современного разработчика. Такие команды, как commit, push, и pullпрочно вошли в мышечную память наших пальцев. Но относительно немногие разработчики знают о «более продвинутых» функциях Git — и о том, насколько невероятно ценными они могут быть! В этой статье мы собираемся изучить «интерактивную перебазировку», один из самых мощных инструментов в Git.

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

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

Почему важна хорошо структурированная история коммитов? Только представьте обратное: трудночитаемая история коммитов, где вы понятия не имеете, что ваши коллеги на самом деле сделали со своими последними изменениями. В таком проекте начинает появляться все больше и больше «темных уголков», и вы понимаете только те мелочи, над которыми работали сами.

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

Что Interactive Rebase может сделать для вас

Interactive Rebase помогает оптимизировать и очистить историю коммитов. Он охватывает множество различных вариантов использования, некоторые из которых позволяют:

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

удалить фиксацию

раздавить/объединить несколько коммитов

изменить порядок коммитов

исправить старые коммиты

разделить/повторно открыть старые коммиты для редактирования

Когда использовать интерактивную перебазировку (а когда нет!)

Как и пара других инструментов Git, интерактивная перебазировка «переписывает историю». Это означает, что когда вы манипулируете серией коммитов с помощью интерактивной перебазировки, эта часть вашей истории коммитов будет перезаписана: хэши SHA-1 фиксации будут изменены. Так сказать, это совершенно новые объекты коммитов.

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

Основной механизм интерактивной операции перебазирования

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

Шаг 1: С чего начать сеанс?

Первый вопрос, на который вам нужно ответить: «Какой частью моей истории коммитов я хочу манипулировать?» Это говорит вам, где вы должны начать свой интерактивный сеанс перебазирования. Давайте сделаем практический пример и скажем, что мы хотели бы отредактировать старое сообщение коммита (что мы и сделаем на практике через мгновение).

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

Редактирование старого сообщения коммита с помощью интерактивной перебазировки

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

Шаг 2: начало сеанса!

Начать настоящий сеанс довольно просто:

$ git rebase -i HEAD~3

Мы используем git rebaseкоманду с -iфлагом (чтобы указать, что мы действительно хотим, чтобы она была «интерактивной») и предоставляем базовую фиксацию (которую мы придумали на первом шаге выше). В этом примере я использовал HEAD~3, чтобы указать фиксацию, которая «3 позади фиксации HEAD». В качестве альтернативы я также мог бы предоставить конкретный хэш SHA-1.

Шаг 3: сообщите Git, что вы хотите сделать

После запуска интерактивного сеанса перебазирования вам будет представлено окно редактора, в котором Git перечисляет серию коммитов — от последнего коммита до (но не включая) того, который вы выбрали в качестве базового коммита на шаге 1.

Окно редактора открывается после запуска интерактивного сеанса перебазирования.

На этом этапе следует помнить о двух важных вещах:

Коммиты перечислены в обратном порядке! Самая новая фиксация, которая, как мы ожидаем, появится вверху, появится внизу списка. Не волнуйтесь: ваш Git-репозиторий работает как скрипка! 🥳 Помните, что мы выполняем интерактивную операцию перебазирования, и для этого требуется, чтобы Git повторно применил коммиты от самых старых к самым новым в конце операции.

Не вносите фактические изменения в этом окне редактора! Хотя вам, возможно, не терпится просто пойти дальше и изменить сообщение коммита в этом окне редактора (в конце концов, это то, что мы на самом деле хотим сделать...), вы должны проявить немного терпения. Здесь мы только собираемся сказать Git, что мы хотим сделать, но не вносить реальные изменения. Я продемонстрирую этот момент на практике в ближайшее время!

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

Редактирование старого сообщения фиксации

Один из очень популярных вариантов использования интерактивной перебазировки заключается в том, что вы можете отредактировать старое сообщение коммита постфактум. Возможно, вы знаете, что это git commit —amendтакже позволяет вам изменить сообщение коммита, но только если это самый последний коммит. Для любого коммита старше этого мы должны использовать интерактивную перезагрузку!

Рассмотрим конкретный сценарий. Ниже приведено изображение сообщения о неправильном коммите, которое необходимо исправить.

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

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

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

Наш первый шаг — определить базовую фиксацию для запуска этого интерактивного сеанса перебазирования. Так как мы должны (как минимум) вернуться к родителю нашего коммита «плохого яблока», мы начинаем нашу сессию с HEAD~3 (три коммита после коммита HEAD, который называется «Изменить заголовки...»).):

$ git rebase -i HEAD~3

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

Размечаем коммит, который хотим изменить

Напоминаем: хотя у вас может возникнуть соблазн сделать это, мы не меняем здесь сообщение коммита. Мы только помечаем соответствующую строку «ключевым словом действия». В нашем случае мы хотим rewordзафиксировать (что означает, что мы хотели бы изменить сообщение фиксации, но оставить остальную часть фиксации как есть).

Практически все доступные ключевые слова действий задокументированы в нижней части этого окна — так что нет необходимости запоминать что-либо наизусть!

Как только вы заменили стандартное pickключевое слово (которое означает «принять фиксацию как есть») предпочитаемым ключевым словом действия, вы можете просто сохранить и закрыть окно.

После этого откроется новое окно редактора, содержащее текущее сообщение фиксации. Наконец, нам разрешено делать то, что мы намеревались сделать в первую очередь: редактировать сообщение этого старого коммита!

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

После внесения нашего изменения, а затем сохранения и закрытия окна редактора интерактивный сеанс перебазирования завершен — и наше сообщение фиксации обновлено! 🎉

Удаление нежелательного коммита

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

Коммит, которого никогда не должно было случиться

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

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

$ git rebase -i 6bcf266b

Обратите внимание, что на этот раз я использовал в git rebase -iкоманде конкретный хэш SHA-1. Конечно, вместо хэша коммита я мог бы использовать HEAD~2адрес этого коммита.

После выполнения этой команды нам снова предоставляется список коммитов.

Отмечаем коммит, который хотим удалить

На этот раз мы используем dropключевое слово action, чтобы избавиться от нежелательной фиксации. В качестве альтернативы, в этом особом случае, мы могли бы просто удалить всю строку из редактора. Если при сохранении и закрытии окна больше нет строки (представляющей фиксацию), Git удалит соответствующую фиксацию.

Как бы вы ни решили это сделать, после того, как вы сохранили и закрыли окно редактора, коммит будет удален из истории вашего репозитория!

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

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

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

Представьте, что вы заметили проблему со старым коммитом. Затем вы можете продолжить и создать новую фиксацию, которая устраняет проблему. В такой ситуации возможность объединить эти коммиты в один имеет большой смысл: новый коммит, в конце концов, был просто «пластырем» для решения проблемы, которой не должно было быть в первом. место. Объединив эти коммиты, похоже, что проблемы никогда не было!

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

Обоснование в обоих примерах одинаковое: объединяя два (или несколько) коммитов, которые изначально должны были быть одним, вы создаете более чистую и удобочитаемую историю коммитов!

Давайте вместе рассмотрим практический пример и возьмем ситуацию, изображенную ниже, в качестве исходной.

Исходная ситуация для нашей операции по сквошу

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

$ git rebase -i HEAD~3

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

Окно редактора, содержащее наш диапазон коммитов

Я уже упоминал, что в этом случае мы собираемся использовать squashключевое слово action. Есть важная вещь, которую нужно знать о том, как это squashработает: строка, которую вы помечаете ключевым словом, будет объединена со строкой, расположенной прямо над ней! Это объясняет, почему я пометил строку 2 squashключевым словом в нашем примере.

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

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

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

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

Наконец, после закрытия редактора мы видим, что наши коммиты были объединены.

Использование возможностей интерактивной перебазировки

Надеюсь, вы согласны с тем, что интерактивные инструменты перебазирования Git могут быть очень ценными! Нам, разработчикам, важно стремиться к чистой и ясной истории коммитов. Это важнейший компонент для поддержания здоровой и понятной кодовой базы (как для ваших товарищей по команде, так и для вас самих, по прошествии некоторого времени).

3D-печать5GABC-анализAndroidAppleAppStoreAsusCall-центрChatGPTCRMDellDNSDrupalExcelFacebookFMCGGoogleHuaweiInstagramiPhoneLinkedInLinuxMagentoMicrosoftNvidiaOpenCartPlayStationPOS материалPPC-специалистRuTubeSamsungSEO-услугиSMMSnapchatSonyStarlinkTikTokTwitterUbuntuUp-saleViasatVPNWhatsAppWindowsWordPressXiaomiYouTubeZoomАвдеевкаАктивные продажиАкцияАлександровск ЛНРАлмазнаяАлчевскАмвросиевкаАнализ конкурентовАнализ продажАнтимерчандайзингАнтрацитАртемовскАртемовск ЛНРАссортиментная политикаБелгородБелицкоеБелозерскоеБердянскБизнес-идеи (стартапы)БрендБрянкаБукингВахрушевоВендорВидеоВикипедияВирусная рекламаВирусный маркетингВладивостокВнутренние продажиВнутренний маркетингВолгоградВолновахаВоронежГорловкаГорнякГорскоеДебальцевоДебиторкаДебиторская задолженностьДезинтермедитацияДзержинскДивизионная система управленияДизайнДимитровДирект-маркетингДисконтДистрибьюторДистрибьюцияДобропольеДокучаевскДоменДружковкаЕкатеринбургЕнакиевоЖдановкаЗапорожьеЗимогорьеЗолотоеЗоринскЗугрэсИжевскИловайскИрминоКазаньКалининградКировскКировскоеКомсомольскоеКонстантиновкаКонтент-маркетингКонтент-планКопирайтингКраматорскКрасноармейскКрасногоровкаКраснодарКраснодонКраснопартизанскКрасный ЛиманКрасный ЛучКременнаяКураховоКурскЛисичанскЛуганскЛутугиноМакеевкаМариупольМаркетингМаркетинговая информацияМаркетинговые исследованияМаркетинговый каналМаркетинг услугМаркетологМарьинкаМедиаМелекиноМелитопольМенеджментМерчандайзерМерчандайзингМиусинскМолодогвардейскМоскваМоспиноНижний НовгородНиколаевНиколаевкаНишевой маркетингНовоазовскНовогродовкаНоводружескНовосибирскНумерическая дистрибьюцияОдессаОмскОтдел маркетингаПартизанский маркетингПервомайскПеревальскПетровскоеПлата за кликПоисковая оптимизацияПопаснаяПравило ПаретоПривольеПрогнозирование продажПродвижение сайтов в ДонецкеПроизводство видеоПромоПромоушнПрямой маркетингРабота для маркетологаРабота для студентаРазработка приложенийРаспродажаРегиональные продажиРекламаРеклама на асфальтеРемаркетингРетро-бонусРибейтРитейлРовенькиРодинскоеРостов-на-ДонуРубежноеСамараСанкт-ПетербургСаратовСватовоСвердловскСветлодарскСвятогорскСевастопольСеверодонецкСеверскСедовоСейлз промоушнСелидовоСимферопольСинергияСколковоСлавянскСнежноеСоздание сайтов в ДонецкеСоледарСоциальные сетиСочиСтаробельскСтаробешевоСтахановСтимулирование сбытаСуходольскСчастьеТелемаркетингТельмановоТираспольТорговый представительТорезТрейд маркетингТрейд промоушнТюменьУглегорскУгледарУкраинскХабаровскХарцызскХерсонХостингЦелевая аудиторияЦифровой маркетингЧасов ЯрЧелябинскШахтерскЮжно-СахалинскЮнокоммунаровскЯндексЯсиноватая