Ответ @Michael хорош, если ваши коммиты представляют собой коммиты с одной функцией, которые не имеют общих зависимостей с фиксациями для какой-либо другой функции. Однако, если вы смешали работу над двумя функциями в каком-либо коммите, вам понадобится интерактивная перебазировка. Он позволяет произвольно перераспределять фрагменты изменений и границы фиксации, а также отслеживает, какие фрагменты еще не были зафиксированы в текущей ветке.
Если изменения функций просто иногда объединяются в коммиты и нет зависимостей между функциями, то для облегчения жизни моей первой попыткой было бы git rebase -i master prototype
разделить коммиты со смешанными фрагментами на два коммита, по одному для каждого, а затем завершить с помощью вишни, как в ответе Майкла. Данный
A1-B2-C12-D2-E1-F12 prototype
где цифры означают, для каких функций коммит содержит код, для `git rebase -i мастер-прототип, который вы редактируете, коммиты C12 и F12,
pick A1
pick B2
edit C12
pick D2
pick E1
edit F12
(с использованием хэша каждого коммита вместо его иллюстративного тега здесь).
Rebase остановится после коммита C12
, и вы можете git reset HEAD~
затем git add --patch
применить все фрагменты функции-1, git commit
создать коммит C1
там, где был C12
, затем git commit -a
применить все оставшиеся фрагменты и создать коммит C2
после него. Вы закончите с
A1-B1-C1-C2-D2-E1-F1-F2
а потом можно git checkout -b feature1 master; git cherry-pick A1 B1 C1 E1 F1
и аналогично для feature2.
В более сложных ситуациях этот метод до сих пор работает с очень небольшими изменениями. Интерактивная перебазировка намного лучше, чем может показаться из вышеизложенного, но, безусловно, лучший способ узнать об этом — сесть за справочную страницу, пока вы залезаете туда и забавляетесь кое-какими фрагментами. Сделайте это, и вскоре может дойти до того, что делать это в качестве ритуала перед публикацией часто оказывается более удобным, чем пытаться обеспечить возможность публикации вашего фактического рабочего процесса на каждом шагу.
person
jthill
schedule
30.10.2014