2012-05-15 5 views
4

У нас есть последовательность событий, как это:Как переустановить после слияния?

  1. Создать ветвь А, и добавить несколько фиксаций к нему
  2. Время проходит, сотни коммитов добавили освоить
  3. Мастер объединяются в
  4. Проходит время, может быть, еще 50 коммитов добавлено в мастер

Можно ли слить слияние на шаге 3 в переустановку? Если ничего другого, это сделало бы приближающееся слияние более простым, так как было бы меньше истории, чтобы посмотреть.

У нас не было разрешено использование reerere.

+0

Это определенно возможно, вы попробовали? –

+1

Хех, позвольте мне перефразировать: как вы это делаете? –

+0

согласно http://schacon.github.com/git/git-rebase.html - вы находитесь на ветке A и запускаете 'git rebase master' (вместо' git merge master') – Cebjyre

ответ

0

Рассмотрим следующий график 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 
Смежные вопросы