Во-первых, давайте предположим, что вы нашли коммит примерно месяц назад, которым вы хотите стать новым первым коммитом, возможно, с git show HEAD@{1.month.ago}
или просто просмотрев git log
.Допустим, этот коммит f414f31
.Предположим также, что имя ветки, над которой вы работаете, называется dev
.
. Вы говорите, что хотите, чтобы это выглядело так, что более поздний коммит был первым в репозитории, поэтому реальногоСуть в том, чтобы хранить эту ветку в одном и том же хранилище - истории вообще не будет.Итак, давайте создадим новый пустой репозиторий, чтобы начать с чистого листа:
mkdir squashed-repository
cd squashed-repository
git init
Теперь давайте добавим удаленный, который ссылается на ваш старый репозиторий, и извлекаем все ветви оттуда как ветви с удаленным отслеживанием.в вашем новом хранилище.
git remote add previous /home/whoever/original-repository/
git fetch previous
Теперь обновите ваше рабочее дерево и индекс из фиксации в начале месяца:
git checkout f414f31 .
(Обратите внимание на .
в концеэтой строки.)
Теперь создайте коммит из состояния индекса:
git commit -m 'A new start.'
Теперь вы используете git rebase
, чтобы воспроизвести все коммиты после f414f31
до ивключая previous/dev
поверх вашего нового master
, который в настоящее время имеет только один коммит.
git rebase --onto master b1cbc10e84bb2e2 previous/master
Возможно, вам придется исправить некоторые конфликты во время этой перезагрузки.По умолчанию git rebase
будет линеаризовать историю при повторном применении изменений, внесенных этими коммитами - вы можете попросить его попытаться сохранить их с помощью -p
, но это может не сработать.
Теперь master
ветка в этом новом репозитории должна быть такой, как вы хотите, чтобы вы могли удалить созданный нами удаленный пульт:
git remote rm previous
Я должен сказать, что обычно стараюсь избегать такого переписыванияистории, особенно если вы поделились оригинальным хранилищем с кем-либо.В любом случае, более ранняя история может быть действительно полезной - неужели так плохо хранить это в вашем хранилище?