Вам нужно переписать всю историю.
Решение 1:
# suppose you are now on the branch master
git checkout --orphan temp CommitY
# make the new root commit
git commit
# apply the commits after CommitY to temp
git cherry-pick CommitY..master
# reset master to the new head
git checkout master
git reset temp --hard
git branch -D temp
Решение 2:
Чтобы наглядно продемонстрировать процесс, давайте обозначим CommitX буквой A, а последующие - B, C, D (CommitY), E и F (Head).
git rebase -i --root
И тогда вы увидите редактор с содержанием:
pick 6988ba0 A
pick cd42d7a B
pick 6b1aa54 C
pick d4bc4d1 D
pick 54c78e5 E
pick fc2f728 F
Изменить pick
из B
, C
и D
на squash
или s
.
pick 6988ba0 A
s cd42d7a B
s 6b1aa54 C
s d4bc4d1 D
pick 54c78e5 E
pick fc2f728 F
Сохранить и выйти. Появится другой редактор с сообщением о фиксации по умолчанию, чтобы вы могли ввести сообщение о фиксации для нового корня. После редактирования сохраните и выйдите. A
, B
, C
и D
сводятся к одному коммиту в качестве нового корня. E
и F
применяются повторно.
В обоих случаях коммиты переписываются / воссоздаются ,, поэтому их хэши являются новыми. Вам может потребоваться принудительное нажатие, чтобы обновить ветку в удаленном хранилище.