Это многостраничный печатный вид этого раздела. Нажмите что бы печатать.

Вернуться к обычному просмотру страницы.

Упорядочивание коммитов (rebase)

Упорядочивание коммитов и очистка истории

Что такое git rebase?

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

Основные характеристики

  • Изменение базы коммитов: git rebase переносит серию коммитов на новую базовую ветку.
  • Линейная история: Rebase создаёт более чистую, линейную историю изменений, избегая лишних коммитов слияния (merge commits).
  • Перезапись истории: Rebase перезаписывает историю коммитов, что делает его мощным, но потенциально опасным инструментом.

Синтаксис

git rebase <база>
  • <база> – ветка или коммит, на который вы хотите переместить текущую ветку.

Пример использования

  1. Обычное rebase:
    git checkout feature-branch
    git rebase main
    
    Эта команда перемещает коммиты из ветки feature-branch на вершину ветки main.

Полезные флаги и опции

  • -i или --interactive: Включает интерактивный режим, позволяя изменять, объединять или удалять коммиты.

    git rebase -i HEAD~3
    
  • --onto: Позволяет указать новую базу для ветки, отличную от базовой ветки.

    git rebase --onto <новая-база> <старая-база> <ветка>
    
  • --continue: Продолжает процесс rebase после разрешения конфликтов или редактирования коммита.

    git rebase --continue
    
  • --abort: Прерывает процесс rebase и возвращает репозиторий в состояние до начала rebase.

    git rebase --abort
    
  • --skip: Пропускает текущий коммит и продолжает процесс rebase.

    git rebase --skip
    

Пример работы с конфликтами

  1. Выполните git rebase:

    git rebase main
    
  2. Если возникают конфликты, Git остановит процесс rebase и уведомит вас об этом. Разрешите конфликты, отредактировав соответствующие файлы.

  3. После разрешения конфликтов добавьте изменённые файлы:

    git add <файл-с-конфликтом>
    
  4. Продолжите процесс rebase:

    git rebase --continue
    
  5. Если необходимо, повторите шаги 2-4, пока все конфликты не будут разрешены и rebase не завершится.

Примечание

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

Примеры использования

  1. Интерактивный rebase последних 5 коммитов:

    git rebase -i HEAD~5
    
  2. Rebase текущей ветки на другую базу:

    git rebase --onto new-base upstream-branch topic-branch
    

1 - Что такое rebase и как он работает?

Что такое rebase?

rebase – это команда в Git, которая позволяет перемещать или объединять последовательность коммитов на новую базу, что позволяет переписать историю проекта. Это часто используется для упрощения истории коммитов, избегая ненужных слияний (merge) и упорядочивая изменения.

Как работает rebase в Git?

Шаг 1: Откройте терминал или командную строку

Откройте терминал (на Mac или Linux) или командную строку (на Windows).

Шаг 2: Перейдите в директорию вашего локального репозитория

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

cd /путь/к/вашему/репозиторию

Шаг 3: Убедитесь, что все изменения закоммичены

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

git status

Шаг 4: Выполните команду rebase

Используйте команду git rebase, чтобы начать процесс rebase. Укажите ветку, относительно которой вы хотите выполнить rebase.

git rebase <ветка-цели>

Пример:

git rebase main

Шаг 5: Разрешите конфликты (если они возникнут)

Если во время rebase возникают конфликты, Git остановит процесс и позволит вам разрешить их. После разрешения конфликта используйте команды git add и git rebase --continue, чтобы продолжить rebase.

  1. Разрешите конфликт и добавьте изменённые файлы:
    git add <файл-с-конфликтом>
    
  2. Продолжите rebase:
    git rebase --continue
    

Шаг 6: Завершите процесс rebase

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

git rebase --abort

Шаг 7: Сделайте push изменений (если необходимо)

После завершения rebase сделайте push изменений в удалённый репозиторий. Если вы изменили коммиты, которые уже были отправлены в удалённый репозиторий, используйте команду --force (или сокращённо -f).

git push --force origin <ваша-ветка>

Пример:

git push --force origin feature-branch

Полезные команды

  • Отмена rebase:

    git rebase --abort
    
  • Продолжение rebase после разрешения конфликтов:

    git rebase --continue
    
  • Пропуск проблемного коммита:

    git rebase --skip
    

Теперь вы знаете, что такое rebase и как он работает в Git.

2 - Как с помощью git rebase почистить историю коммитов?

Шаг 1: Откройте терминал или командную строку

Откройте терминал (на Mac или Linux) или командную строку (на Windows).

Шаг 2: Определите количество коммитов, которые вы хотите пересмотреть

Посмотрите историю коммитов, чтобы определить, сколько коммитов вы хотите пересмотреть.

git log --oneline

Это покажет список ваших последних коммитов в краткой форме.

Шаг 3: Начните интерактивный rebase

Используйте команду git rebase -i (интерактивный rebase) и укажите количество коммитов, которые вы хотите пересмотреть. Например, если вы хотите пересмотреть последние 5 коммитов, используйте:

git rebase -i HEAD~5

Шаг 4: Объедините или отредактируйте коммиты

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

  • pick: Оставить коммит как есть.
  • reword: Оставить коммит, но изменить его сообщение.
  • edit: Остановиться на этом коммите для внесения изменений.
  • squash: Объединить этот коммит с предыдущим.
  • fixup: То же, что и squash, но не сохраняет сообщение коммита.
  • drop: Удалить этот коммит.

Пример файла:

pick <hash1> Коммит 1
reword <hash2> Коммит 2
squash <hash3> Коммит 3
pick <hash4> Коммит 4
drop <hash5> Коммит 5

Сохраните файл и закройте редактор.

Шаг 5: Внесите изменения и сохраните их

Если вы выбрали reword, edit, squash или fixup, редактор откроется ещё раз для внесения изменений или редактирования сообщений коммитов. Внесите необходимые изменения, затем сохраните файл и закройте редактор.

Шаг 6: Завершите rebase

После закрытия редактора Git завершит процесс rebase и применит изменения к истории коммитов.

Шаг 7: Сделайте push изменений (если необходимо)

Если вы уже отправили коммиты в удалённый репозиторий, вам нужно будет использовать --force для отправки изменённой истории коммитов:

git push --force origin <ваша-ветка>

Пример:

git push --force origin main

Полезные команды

  • Просмотр истории коммитов:

    git log --oneline
    
  • Отмена интерактивного rebase (если возникли проблемы):

    git rebase --abort
    

Теперь вы знаете, как с помощью git rebase почистить историю коммитов в Git.

3 - Полезные флаги для git rebase

Команда git rebase поддерживает несколько флагов, которые позволяют контролировать процесс rebase и изменять его поведение. Вот основные флаги, которые можно использовать с командой git rebase.

Основные флаги команды git rebase

-i или --interactive

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

git rebase -i <base>

-p или --preserve-merges

Сохраняет коммиты слияния (merge commits) при выполнении rebase.

git rebase -p <base>

-r или --rebase-merges

Перестраивает коммиты слияния при выполнении rebase. Это позволяет изменять коммиты слияния так, как если бы они были обычными коммитами.

git rebase -r <base>

--onto

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

git rebase --onto <newbase> <upstream> <branch>

--continue

Продолжает процесс rebase после разрешения конфликтов или редактирования коммита.

git rebase --continue

--abort

Прерывает процесс rebase и возвращает репозиторий в состояние до начала rebase.

git rebase --abort

--skip

Пропускает текущий коммит и продолжает процесс rebase. Используется, если коммит невозможно применить без конфликтов.

git rebase --skip

-X или --strategy-option

Передаёт параметры выбранной стратегии слияния.

git rebase -X theirs <base>

-S или --gpg-sign

Позволяет подписывать коммиты с использованием GPG.

git rebase -S <base>

--exec

Выполняет указанную команду после каждого коммита при выполнении rebase.

git rebase --exec "команда" <base>

-q или --quiet

Уменьшает количество выводимых сообщений во время выполнения rebase.

git rebase -q <base>

-v или --verbose

Увеличивает количество выводимых сообщений во время выполнения rebase.

git rebase -v <base>

Примеры использования

  1. Интерактивный rebase последних 5 коммитов:

    git rebase -i HEAD~5
    
  2. Rebase текущей ветки на другую базу:

    git rebase --onto new-base upstream-branch topic-branch
    
  3. Продолжение rebase после разрешения конфликтов:

    git rebase --continue
    
  4. Прерывание rebase:

    git rebase --abort
    
  5. Rebase с параметром стратегии слияния:

    git rebase -X theirs master
    

Теперь вы знаете основные флаги команды git rebase и как они могут быть использованы для управления процессом rebase.