Возникла необходимость оптимизировать историю моего первого репозитория (форка другой репы), который (естественно) был весьма корявым. За 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
Пишите комменты 😉