Используйте checkout -i
, чтобы интерактивно выбрать нужные биты в одну половину и зафиксировать это.Затем используйте git revert
на ветке со всем, чтобы удалить то, что вы разбили.
Из вашего примера на ветке foo с родителем A:
---A---foo
Создайте новую ветку и добавьте в интерактивном режимеизменения, которые вы хотите там:
git co -b halfFoo foo~
git checkout -i foo
git commit
Это дает:
---A---foo
\
\-halfFoo
Затем легко создайте ветку foo без элементов, выбранных для halfFoo, используя git revert
:
git co -b otherHalfFooWithHistory foo
git revert halfFoo
---A---foo
\ \-otherHalfFooWithHistory
\-halfFoo
Это концептуально то, что вы хотите для otherHalfFoo, но у него есть история, когда существовал весь foo, а затем часть из него была удалена.Вы можете при желании очистить его с помощью merge --squash
:
git co -b otherHalfFoo foo~
git merge --squash otherHalfFooWithHistory
git branch -D otherHalfFooWithHistory
---A---foo
|\
| \-halfFoo
\
\-otherHalfFoo