Обмен технологиями

[Заметки по изучению Git] Глава 4. Операция git rebase rebase и связанные с ней примеры (часть 1)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Глава 4. Операции перебазирования и связанные с ними случаи

【соответствующая тема】

  • Воля commit Перебазировать версию в другую ветку
  • Выполните перебазирование в случае конфликта версий.
  • Выполнить интерактивное перебазирование указанной версии.
  • Использование интерактивного перебазирования для агрегирования версий
  • Изменение коммиттеров с помощью интерактивного перебазирования
  • Версия автоматического агрегирования

4.0 Введение в перебазирование

Перебазировать (Rebasing ) — чрезвычайно мощная функция Git.Перебазирование — это тип операции: еслиcommit А Самый ранний был основан наcommit Б тогдаА Перебазировать вС, то есть будет А стать основанным наС операция.

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

4.1 будет commit Перебазировать версию в другую ветку

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

Все еще с jgit Библиотека, например:

# Clone jgit repo into chapter4
$ git clone https://git.eclipse.org/r/jgit/jgit chapter4
$ cd chapter4
# Checkout a new branch
$ git checkout -b rebaseExample --track origin/stable-3.1
# Create the 1st commit
$ echo "My Fishtank
    
Gravel, water, plants
Fish, pump, skeleton" > fishtank.txt
$ git add fishtank.txt
$ git commit -m "My brand new fishtank"
# Create the 2nd commit
$ echo "mosquitos" >> fishtank.txt
$ git add fishtank.txt
$ git commit -m "Feeding my fish"
# Rabase to stable-3.2
$ git rebase origin/stable-3.2
Successfully rebased and updated refs/heads/rebaseExample.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

Перед перебазированием:

Вставьте сюда описание изображения

После перебазирования:

Вставьте сюда описание изображения

git rebase Процесс исполнения:

  1. оказаться HEAD Общая версия целевой ветки, на которую указывает перебазирование (merge-base);
  2. на основе merge-base, найти все недостающие версии в целевой ветке;
  3. Попробуйте применить недостающие версии одну за другой к целевой ветке.

4.2 Выполнение перебазирования в случае конфликта версий

Если commit версия илиbranch Перебазировать ветку в другуюHEAD , могут возникнуть конфликты версий.На этом этапе конфликт должен быть разрешен и запущена командаgit rebase --continue, перебазирование может быть завершено.

Примеры в этом разделе демонстрируют, как выполнить перебазирование при наличии конфликтов.После окончательного результата, продемонстрированного в разделе 4.1, на этот разrebaseExample Филиал был перебазирован в г.stable-3.2 ветвь.В примере будет перепроверена новая ветка из стабильной версии 3.1 и добавлены иrebaseExample Текстовые файлы с тем же именем ветки, но несовместимым содержимым.fishtank.txt

# Checkout rebaseExample2
$ git checkout -b rebaseExample2 --track origin/stable-3.1
# Add a new commit
$ echo "My Fishtank
Pirateship, Oister shell
Coconut shell
">fishtank.txt
$ git add fishtank.txt
$ git commit -m "My brand new fishtank"
# Rebase conflicting branches
$ git rebase rebaseExample
Auto-merging fishtank.txt
CONFLICT (add/add): Merge conflict in fishtank.txt
error: could not apply 24f9bf1ef... My brand new fishtank2
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 24f9bf1ef... My brand new fishtank2
$ subl fishtank.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

Конфликтная ситуация следующая:

Вставьте сюда описание изображения

Перейдите к следующему содержимому, сохраните и закройте:

Вставьте сюда описание изображения

Добавьте объединенные файлы и продолжите перебазирование:

$ git add fishtank.txt
$ git rebase --continue
hint: Waiting for your editor to close the file...
  • 1
  • 2
  • 3

Открывшийся редактор показан на рисунке:

Вставьте сюда описание изображения

Подтвердите, сохраните и закройте, и вы увидите сообщение о том, что перебазирование прошло успешно:

$ git rebase --continue
[detached HEAD 9911772b3] My brand new fishtank2
 1 file changed, 2 insertions(+), 3 deletions(-)
Successfully rebased and updated refs/heads/rebaseExample2.
# Check new status via gitk
$ gitk
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Подробности следующие:

Вставьте сюда описание изображения

Видно, что при этом перебазировании будут перебазированы только те версии, которые присутствуют в старой ветке, но отсутствуют в новой ветке (то есть будут добавлены новые версии) commit)。

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

  1. git rebase --abort: В буквальном смысле прервать перебазирование

  2. git rebase --skip: Пропустить конфликты и выполнить перебазирование напрямую, что приведет к rebaseExample2 Откажитесь от новогоcommit, непосредственно слился с rebaseExample, на который указывал родительский элемент после перебазирования, и rebaseExample Последовательный:

    Вставьте сюда описание изображения


4.3 Выполнение интерактивного перебазирования указанной версии

В этом примере мы используем rebaseExample На основе ветвей продемонстрируйте, как использовать--interactive Марк, перебазируй эти два в 4.1.commit Перебазировать в ветку удаленного отслеживанияstable-3.1 начальство:

$ git checkout rebaseExample
Switched to branch 'rebaseExample'
Your branch is ahead of 'origin/stable-3.1' by 109 commits.
  (use "git push" to publish your local commits)
$ git rebase origin/stable-3.1
  • 1
  • 2
  • 3
  • 4
  • 5

В это время во всплывающем редакторе будет отображаться список коммитов с диапазоном rebaseExample иstable-3.1 между ними все может быть перебазировано наstable-3.1 изcommit Записывать.Оставьте два новых в примереcommit, удалите все остальное (то есть содержимое строки 89 и ранее):

Вставьте сюда описание изображения

После сохранения выйдите из редактора и вы увидите следующий результат:

$ git rebase --interactive origin/stable-3.1
Successfully rebased and updated refs/heads/rebaseExample.
# Check in gitk view:
  • 1
  • 2
  • 3

Результат следующий:

Вставьте сюда описание изображения

Пример расширения

В этом примере также можно быстро добиться желаемого эффекта с помощью команды:

$ git rebase --onto origin/stable-3.1 origin/stable-3.2 rebaseExample
Successfully rebased and updated refs/heads/rebaseExample.
  • 1
  • 2

Схема до и после перебазирования следующая:

Вставьте сюда описание изображения