Правильный перенос истории git в новую ветку


Сквашим свои нубские коммиты

Возникла необходимость оптимизировать историю моего первого репозитория (форка другой репы), который (естественно) был весьма корявым. За 3 года там собралось множество мусора; данные, которых там быть не должно и сотни лишних коммитов, которые затрудняли навигацию по истории репы.

Обычно можно все сквашить прямо «на горячем». Однако из-за множества мержей уже не посквашить.

Горсточка вишенок

Первое, что я попробовал — тупо клонировал upstream-master в новую ветку. Начал туда cherry-pick’ать коммиты из своего origin-master (см. скрин слева). Но тут возникла неприятность. Мой основной форк-origin переплетался с upstream. В итоге, приходилось при resolve конфликтов затирать куски коммитов. Ну и вообще каша вышла полная — снизу 2019, сверху 2020+ (см. скриншот снизу).

Как правильно поступать в таком случае:

делаем пустую ветку:
git checkout --orphan BRANCH_NAME

Вычищаем все из нее:
git rm -rf .

Теперь можно ручками брать вишнки и класть в нужном порядке на тортик 😉 Но…

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

git remote add other https://example.link/repository.git
git fetch other

Получаем вот что:

Теперь люто-дико делаем наш первый черри пик, вот мой, например:

$ git cherry-pick 7426dcff775e43fc71ea42b7cb146e5551c44804

И теперь можно спокойно отвязать ремоут и возвращаться в GUI:

git remote remove other

Пишите комменты 😉


Запись опубликована в рубрике Git. Добавьте в закладки постоянную ссылку.

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

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.