2012-09-28 3 views
3

저는 현재 거대한 프로젝트를 SVN에서 Git으로 가져 왔습니다. 나는 모든 지점을 평평하게하고 단지 2를 유지하기로 결정했다. 마스터 지점과 분기 지점.힘내 : 지난 몇 년 동안 분기가 복잡한 분기를 병합하는 방법

Master: A-B-C-D 
       \ X-Y: Bugfix 

Diverged: E-F-G-H 

분산 된 소스 코드에는 많은 소스 코드가 포함되어 있지만 일부는 여전히 마스터에서 생성됩니다. 버그 수정을해야 할 때 수동으로 Master와 Diverged를 SVN에 패치해야합니다. 나는 Bugfix를 마스터 (여기서는 문제 없음)와 병합하고 Bugfix를 Diverged에 병합하고 싶습니다.

이전 커밋을 마스터에서 Diverged에 삽입하고 싶지는 않습니다. 따라서 ABCD는 무시해야합니다. 을 찾고 구조 메신저는 이것이다 :

Master: A-B-C-D-X-Y 

Diverged: E-F-G-H-X-Y 

사람이 날이를 알아내는 데 도움이 있을까요?

답변

2

분기 분기를 병합하는 것은 항상 고통 스럽습니다.

먼저 몬스터 병합에 도움이되는 유용한 git 명령을 기억해야합니다.

git log HEAD..origin/master - 지점 간의 차이점을 보여줍니다.

단순한 git merge origin/master이 작동하지 않으면 병합을 일련의 작은 작업으로 분할하십시오.

git rebase remotes/origin/master

당신은 (아마도 많은 커밋에) 각각의 모든 갈등을 해결하는 지루한 작업으로 끝날 것이다 변경 지역화 될 수 있도록 나는 현재 마스터의 상단에 분기 지점을 리베이스 제안 그러나 이러한 작은 작업은 전체 병합을 한 번에 처리하는 것이 훨씬 간단합니다. 리베이스 후

Master: A-B-C-D-X-Y 
Diverged: E-F-G-H-X-Y 

git checkout diverged 
git rebase master 

는 가지의 끝 부분에 마스터를 빠르게 전달할 수 있습니다 완료 :

Master: A-B-C-D-X-Y 
        \ E-F-G-H 

빈 커밋은 생략한다. 가장 복잡한 시나리오에서 분기에 대화식 rebase를 사용하여 커밋을 다시 정렬 할 수 있습니다. 즉, 귀하의 계획에 대해 :

수동 작업이지만 여전히 분단 및 정복 전술입니다.

어떤 깊이있는 아이디어를이 게시물 읽기 : http://blog.springsource.org/2010/12/21/git-and-social-coding-how-to-merge-without-fear/

1

귀하의 예를 쉽게 (떨어져 병합 충돌에서) git cherry-pick 해결할 수 있습니다.

커밋을 복사하여 다른 분기에 적용합니다.

git checkout diverged 
git cherry-pick X Y 

예를 들어 설명한대로 상황이 발생하지만 사실은 아무 것도 병합하지 않습니다.

관련 문제