Рассмотрим следующий график Git:
A...C...D...F
^ ^^master
\ \
G...H...I...J
^feature
и ... означает "много фиксаций".
Предположим, что мы хотим существенно переустановить, т. Е. Совершить фиксации в истории объекта, но не в истории мастера, и реформировать их как линейную последовательность коммитов в мастер. Это противоречило тем фактом, что мы объединили master в функцию при фиксации I
. Если мы попытаемся переустановить, Git завинчивается, потому что он пытается применить, например. C
поверх мастера и находит конфликты.
Мы можем решить эту проблему, захватив фактические изменения от feature
и упаковывая их в новую фиксацию. Вот способ сделать это, используя только самые основные команды Git:
(1) git checkout feature
(2) git merge master
(3) git reset A
(4) git add -A # This stages all working copy changes
(5) git commit -m "Every change between A and J"
На стадии (2), то feature
филиал имеет все изменения в обоих master
и J
. После шага (3) HEAD указывает на A
, но наша рабочая копия имеет все изменения от master
и J
, а также шаги (4) и (5) и фиксируют эти изменения.
На данный момент наш график выглядит как этот
A...C...D...F
^ ^master
\
J'
^feature
Обратите внимание, что J'
содержит все в A...F
. Теперь мы делаем
git rebase master
Git счастливо применяет изменения в J'
как новое обязательство J''
, но только изменения, чтобы добавить те в G...J
, потому что другие изменения уже в мастера. Так что теперь у нас есть
A...F<--J''
master^ ^feature
со всеми изменениями в нашей отрасли feature
раздавленных в совершение J''
. На этом этапе вы можете сбросить до F
и внести изменения в J''
более гранулированным способом (даже используя git add --patch
), если хотите.
Другой способ сделать по существу то же самое с read-tree
, как описано в this other answer
git checkout master
git read-tree -u -m feature
Еще один способ сделать то же самое, украденную из this answer, является
git diff master > feature.patch
git checkout master
patch -p1 < feature.patch
Это определенно возможно, вы попробовали? –
Хех, позвольте мне перефразировать: как вы это делаете? –
согласно http://schacon.github.com/git/git-rebase.html - вы находитесь на ветке A и запускаете 'git rebase master' (вместо' git merge master') – Cebjyre