Основная хирургия предков - это git filter-branch
территория, с любыми инструментами, удобными для внесения любых изменений в контент. Иногда это проще всего сделать «пока вы там», во фрагменте ветки фильтра, но здесь проще настроить контент заранее и просто использовать ветвь фильтра для переписывания его предков. Материал, который вы можете сделать без переписывания существующего предка, это сделать A---B1---B2
, для начала выполните
git checkout B
git reset A
, и ваше рабочее дерево теперь является содержимым B
, ваш индекс - содержимым A
, и HEAD, т. е. родитель вашего следующего коммита A
, поэтому добавьте контент B1
, однако наиболее удобно:
git add files whose changes all belong in B1
git add --patch files whose changes partially belong in B1
git reset --patch any hunks you added by mistake
git commit # this makes B1
git add . # everything that remains belongs in B2, so add everything
git commit # this makes B2
, и теперь единственное, что осталось, - это переписать родословную, никаких изменений контента не требуется. Выполните только локальную перемонтацию, затем используйте git filter-branch
, чтобы переписать локальную историю, чтобы переписать всю переписанную историю, которая зависит от нее:
git replace --graft C B2
git filter-branch -- --all