моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
【соответствующая тема】
- Воля
commit
Перебазировать версию в другую ветку- Выполните перебазирование в случае конфликта версий.
- Выполнить интерактивное перебазирование указанной версии.
- Использование интерактивного перебазирования для агрегирования версий
- Изменение коммиттеров с помощью интерактивного перебазирования
- Версия автоматического агрегирования
Перебазировать (Rebasing
) — чрезвычайно мощная функция Git.Перебазирование — это тип операции: еслиcommit
А Самый ранний был основан наcommit
Б тогдаА Перебазировать вС, то есть будет А стать основанным наС операция.
В следующем демонстрационном примере вы обнаружите, что перебазирование зачастую не так просто, как кажется.
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.
Перед перебазированием:
После перебазирования:
git rebase
Процесс исполнения:
HEAD
Общая версия целевой ветки, на которую указывает перебазирование (merge-base
);merge-base
, найти все недостающие версии в целевой ветке;Если 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
Конфликтная ситуация следующая:
Перейдите к следующему содержимому, сохраните и закройте:
Добавьте объединенные файлы и продолжите перебазирование:
$ git add fishtank.txt
$ git rebase --continue
hint: Waiting for your editor to close the file...
Открывшийся редактор показан на рисунке:
Подтвердите, сохраните и закройте, и вы увидите сообщение о том, что перебазирование прошло успешно:
$ 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
Подробности следующие:
Видно, что при этом перебазировании будут перебазированы только те версии, которые присутствуют в старой ветке, но отсутствуют в новой ветке (то есть будут добавлены новые версии) commit
)。
В подсказке git о первом прерывании перебазирования вы также можете увидеть две альтернативы:
git rebase --abort
: В буквальном смысле прервать перебазирование
git rebase --skip
: Пропустить конфликты и выполнить перебазирование напрямую, что приведет к rebaseExample2
Откажитесь от новогоcommit
, непосредственно слился с rebaseExample
, на который указывал родительский элемент после перебазирования, и rebaseExample
Последовательный:
В этом примере мы используем 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
В это время во всплывающем редакторе будет отображаться список коммитов с диапазоном 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:
Результат следующий:
Пример расширения
В этом примере также можно быстро добиться желаемого эффекта с помощью команды:
$ git rebase --onto origin/stable-3.1 origin/stable-3.2 rebaseExample
Successfully rebased and updated refs/heads/rebaseExample.
Схема до и после перебазирования следующая: