svn기반 branch사이에 Merge시 파일 누락 이슈에 대하여

svn을 사용하여 branch를 만들고, merge하는 과정은 실제 개발 과정에서 빈번하게 발생하는 일이다. 하지만 생각보다 merge중에 많은 실수를 하는 것도 사실이다. Conflict발생시 resolve를 잘못 한다던가 tree conflict 발생시 제대로 처리를 못한다던가 branch사이에 주체와 대상을 제대로 알지 못해 theirs와 mine을 혼동하는 일도 있다. 여기서는 trunk와 branch사이에서 발생할 수 있는 파일 누락에 대해 한번 살펴보겠다.

trunk,merge, tag의 개념은 여기 링크를 참고하자.

보통 trunk는 최신 작업 소스들이 계속 유지될 수 있는 메인 저장소로 운영된다. 여기서 게임 업데이트 1차로 준비한다고 가정하면, trunk에서 ‘update1’이라는 branch를 생성할 수 있다. ‘update1’에는 작업자들이 1차 업데이트에 필요한 것들을 커밋하고, 만약 ‘update1’에는 반영되지 않고 차후에 반영되어야 할 작업들은 trunk에 커밋할 수 있다.

이제 성공적으로 ‘update1’을 런칭 후 다음 ‘update2’를 준비한다고 가정하자. 그럼 ‘update1’을 trunk로 merge한 후 ‘update2’를 만들면 된다.

이렇게 정상적으로 진행되는 과정 사이에 하나의 변수를 넣어보자. ‘update2’가 한창 작업 중인 가운데 게임 엔진을 업그레이드 해야 하는 이슈가 있다고 해보자. 이때 ‘update2’가 최신 소스이라서 여기서 branch를 하나 생성할 수 있다. ‘engineup’이라는 branch를 생성해보자.

‘engineup’는 시간이 꽤 걸리는 작업일 수 있다. 그래서 ‘update3’는 예정대로 진행하고, ‘engineup’는 최신 소스를 유지하기 위해 ‘update3’를 merge하게 된다.

이 상황에서 문제가 발생한다. 최신 소스(udpate3)를 merge하면, ‘engineup’도 최신 소스로 유지할 수 있어 아무 문제도 없어 보이지만, 여기서 파일 누락이 발생 할 수 있다. 만약 trunk에 important.png라는 파일이 아래 그림과 같이 추가되었다고 해보자.

important.png는 trunk에 추가되었기 때문에 ‘update3’ 에서는 branch생성시 부터 포함되어 있다. 만약 important.png를 ‘update3’에서 변경한 이력이 있을 경우, ‘engineup’에는 important.png의 이력이 존재하지 않기 때문에 tree conflict가 발생한다. ‘update3’에서 변경한 이력이 없을 경우는 important.png는 ‘update3’를 merge했어도 ‘engineup’에서 자연스럽게 누락될 수 있다.

이 상황을 피하기 위해서는 아래와 같이 ‘engineup’에 대한 branch는 trunk로 부터 생성되어야 하고, 원하는 update차수가 engeinup으로 merge되는 방향으로 되어야 한다.

여러 상황에 따라 더 복잡한 경우가 생길 수도 있다. 그리고 작업 여건에 따라 어쩔 수 없이 branch의 branch를 만들어야 될 상황도 있다. 어려운 일이지만 이러한 상황이 발생할 수도 있다는 것을 알아두면 좋을 것 같다.


Leave a Reply

Your email address will not be published. Required fields are marked *