2010-12-07 7 views
8

RepoX에 BranchA 및 BranchB라는 두 개의 분기가 있다고 가정 해 보겠습니다. RepoX에는 SubmoduleY라는 서브 모듈이 있습니다.Git : 병합 및 서브 모듈

BranchA는 개정 'abc'의 SubmoduleY를 가지며, BranchB는 개정 'def'의 SubmoduleY를가집니다.

BranchA를 BranchB에 병합하고 싶지만 BranchB의 SubmoduleY에 'def'의 원래 개정판을 가리키고 싶습니다.

방법 1 :

  1. 체크 아웃 BranchB 나는이 일을 몇 가지 방법을 참조하십시오.
  2. SubmoduleY를 개정판 'abc'로 이동하면 실제 병합이 어려워집니다 (지금은 하위 모듈 수준에서 병합을 수행하지 않으려합니다).
  3. SubmoduleY에 새 개정판을 적용합니다 (병합을 위해 플로팅 할 수 없음).
  4. BranchA를 BranchB에 병합하십시오. 충돌을 해결하십시오.
  5. SubmoduleY를 수정본 'def'로 되돌립니다.
  6. SubmoduleY에 새 개정판을 적용하십시오.
  7. 변경 사항을 기본 저장소로 푸시합니다.

2 방법 : 방법 1과 동일하지만, 대신 6 단계를 수행하는

는, 리베이스와 여분의 서브 모듈을 제거 3.

모두 짜증나는 단점을 갖고있는 것 같다 단계에서 커밋 :

방법 1은 기록에 두 개의 추가 커밋을 넣습니다.

방법 2는 하위 모듈 리비전과 관련된 모든 변경 사항을 잊어 버리기 때문에 해당 커밋이 제거됩니다. 따라서 나중에 병합 할 경우 몇 가지 문제를 다시 처리해야합니다.

더 좋은 방법이 있습니까?

답변

7

메서드 1에서 변형을 수행 할 수 있지만 병합 커밋에서 하위 모듈의 상태가 변경되도록 --amend으로 하위 모듈 버전 (6 단계)에서 변경 내용을 도입하는 커밋을 수행 할 수 있습니다. 즉,이은 다음과 같습니다 당신이 당신의 질문에 제안 내가 병합하기 전에 다른 버전의 서브 모듈을 피하기 위해 노력하고 귀찮게하지 않았다

$ git checkout b 
$ git merge a 
Merge made by recursive. 
example.txt | 1 + 
sY   | 2 +- 
2 files changed, 2 insertions(+), 1 deletions(-) 
create mode 100644 example.txt 
$ cd sY 
$ git checkout def 
[... you get the "detached HEAD" warning ...] 
$ cd .. 
$ git add sY 
$ git commit --amend 

참고. 충돌이있는 경우 서브 모듈을 def에 추가하여 문제를 해결할 수 있습니다. 충돌이 없다면 위에서 언급 한 단계가 잘 수행되어야합니다.

+0

좋은 해결책! 감사. – Ben

관련 문제