2016-08-07 4 views
1

Оглядываясь назад на какую-то работу, которую я сделал, произошла быстрая перемотка вперед, которая действительно затрудняет определение того, что было сработано, поэтому я хотел бы переместить эту фиксацию в ее собственную ветку. Вот моя текущая ситуация:Отмена старой быстрой превентивной фиксации

A--B--C--D 

И скажем, что C - это одна фиксация, которую я хочу переместить. C также (из фиксации FF) имеет свою собственную ветку, которая находится на ней (branch2). Я хочу, чтобы это выглядело как:

A--B--------C2--D 
    \ /
    \ /
     C--/ 

Так C на branch2 и C2 является слияние фиксации и A, B и D находятся на master.

Вот некоторые дополнительные сведения:

$ git reflog show branch2 
245c52c [email protected]{0}: commit: C 
7c2a064 [email protected]{1}: branch: Created from HEAD 

$ git reflog show master 
c0a8aff [email protected]{0}: commit: D 
244c52c [email protected]{1}: merge branch2: Fast-forward 
8a93b2f [email protected]{2}: commit: B 
fe872d8 [email protected]{3}: commit: A 

ответ

2

Если у вас есть:

A--B--C--D (master) 
     | 
    (branch2) 

Вы можете сбросить master и повторить merge (in a non-FF way), то cherry-pickD (или rebase, если D на самом деле несколько фиксаций)

git checkout master 
git branch tmp # mark D if you need to 
git reset --hard B 
git merge --no-ff branch2 

A--B----C2 
    \ /
     --C (branch2) 
     \ 
      --D (tmp) 

Тогда:

git cherry-pick D 

Если D на самом деле состоит из нескольких фиксаций, то 'tmp' филиал пригодится:

git rebase --onto master branch2 tmp 

Это было бы повторить все совершает после branch2 (так исключая C), до до tmp HEAD (то есть D) наверх master (C2)

+0

Есть ли способ сделать это без касания D? В действительности существует довольно много коммитов после D. – thesecretmaster

+0

@thesecretmaster - это то, что происходит в rebase -onto: может быть любое количество бит D на хозяине: все они будут воспроизведены поверх мастера. – VonC

Смежные вопросы