2016-08-07 23 views
1

제가 한 일을 되돌아 보면, 빨리 진행되는 커밋이 있었기 때문에 실제로 어떤 일이 있었는지 말할 수 없었습니다. 그래서 그 커밋을 자체 분기로 옮기고 싶습니다. 여기에 내 현재 상황이있다 :오래된 빠른 foreward 커밋을 취소하십시오.

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) 

당신은 merge (in a non-FF way)master를 재설정하고 다시 실행 할 수 있습니다, 다음 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) 

그런 다음 :

D가 실제로 여러 개의 커밋으로 구성 된 경우
git cherry-pick D 

의 'tmp'분기 유용하게 사용할 것입니다 : 모든 브랜치 (그래서 제외 C) 후 커밋 재생할 것

git rebase --onto master branch2 tmp 

, 최대 tmp까지 HEAD (즉, D) master ( C2)

+0

D를 건드리지 않고이 방법을 사용할 수 있습니까? 현실적으로 D 다음에 커밋이 많이 있습니다. – thesecretmaster

+0

@thesecretmaster는 rebase - 토론토가 들어오는 것입니다 : 마스터에 D 커밋이 여러 개있을 수 있습니다. 마스터의 모든 부분에서 재생되었습니다. – VonC