본문 바로가기

소프트웨어 & 잡다

SVN branch and merge 쉽게 활용하기 #2

이전에 잠깐 SVN에서 branch만들어서 사용하는 법과 merge하는 법을 적은 적이 있다. 뭔가 잘 안되어서 삽질하다가 적은건데, 좋은 방법은 아니었다. 그런데 우연히 블로그 유입경로를 보니 SVN/BRANCH/MERGE가 엄청 많다는걸 알고는, 가만 있을수가 없었다.


사실 적어놓고 잊고 있었는데, 요새 branching을 많이 하다보니, 나름 정형화 된 방법이 있어서 새로 적을까 한다. branch를 생성하고 작업하고, merging 하기까지 일련의 과정을 나열해 보겠다. 잘 모르는 사람을 위해서 당연한것도 적도록 하겠다.


1. branch 만들기

branch를 만든다는것이 최신 trunk를 복사하는것이기 때문에, 기본적인 명령어 사용 순서는 이렇다.

svn copy [TRUNK] [BRANCH PATH]

svn co [BRANCH PATH]


그런데 branch를 자주자주 만들다보면 매우 귀찮다. 그래서 나는 그냥 간단한 스크립트를 하나 만들어서 실행하는 식으로 한다.


[branch.sh]

@!/bin/bash

svn copy svn+ssh://svnpath/trunk svn+ssh://svnpath/branches/$1 -m "Create $1 branch"

svn co svn+ssh://parki@bt-svn.uk.nds.com/abr-encryptor/branches/$1


그리고는 branch 이름과 함께 스크립트를 실행시키면, 쉽게 만들수 있다.

./branch.sh CQ123456_Fix_Blah


2. branch에서 작업

Branch에서 무슨 작업을 하던 그냥 commit 하면 된다. 


3. trunk의 변경점을 branch에 적용하기

여러명이 함께 작업하는 경우, branch에서 내 작업을 하는동안 다른 사람에 의해 trunk가 변경되기도 한다. 혹은 내가 연관있는 여러 branch를 동시에 작업하다가 하나를 commit하면, 이를 다른 branch에 적용 시킬 필요가 있다. code review등을 위해서라도 trunk를 merge 하는것은 게을리 하지 않는것이 좋다. 


merge 하는것은 매우 쉽다. branch directory root에 들어간후 아래처럼 입력하면 된다.

svn merge --dry-run ^/trunk (dry-run으로 미리 결과 예측)

svn merge ^/trunk


dry-run 옵션을 통해서 conflict 등의 문제가 있는지 미리 확인하고, 만약 문제가 발생할거 같으면 실제 merge를 하기 전에 최대한 고쳐보도록 힘쓰는것이 좋다. 그리고 merge 후에는 꼭 build를 다시 해보고, commit 하는것을 습관을 들이자.


4. branch 작업 완료. trunk에 적용하기

드디어 branch에서 작업을 완료했고, 동료에게 코드리뷰도 합격 받았으면 trunk에 적용 시킬 일만 남았다. 나는 보통 trunk에 적용시키기 전에 3번 과정을 한번 수행한다. 그런데 꼭 그럴 필요는 없고 본인들 판단하에 하면 된다.


Trunk로 merge하려면 trunk directory root로 들어간 후 아래처럼 입력하면 된다.


svn merge --dry-run ^/branches/mybranchname

svn merge ^/branches/mybranchname


부드럽게 잘 merging 되면 좋은데, 작업이 복잡한 경우 conflicts 때문에 merging이 실패하는 경우가 많다. 이는 dry-run을 했을 때 발견 가능하므로 무시하고 merging 을 시도하지 않도록 하자. 귀찮아진다. 


conflicts들은 보통 SVN이 코드 변화를 계산해 내기에 너무 복잡한 변화가 발생한 경우나, trunk를 branch로 merge하는 과정에서 중복된 변경 항목들이 발생한 경우에 나타난다. 일반적인 경우 간단한 추가 옵션(--reintegrate)으로 해결이 가능하다.


svn merge --dry-run --reintegrate ^/branches/mybranchname

svn merge --reintegrate ^/branches/mybranchname


reintegrate 옵션으로도 몇몇 conflicts들이 해결 안되는 경우가 있다. tree conflicts 들이 주로 끝까지 귀찮게 한다. 당연히 원인을 분석해서 상황에 맞게 대처하면 모두 해결 할 수 있다. 하지만 일일이 여기에 나열하기는 어렵고, 구글을 통해 확인해 보면 대부분 답이 있다.


하지만 그전에, 받아놓았던 trunk 디렉터리를 싹 지우고, 다시 check out 받아서 reintegrate merging을 시도해 보길 권장한다. 가끔 실수 혹은 unit test, validation 등에 의해 발생한 잔여 파일들에 의해서 원인을 알기 어려운 conflicts가 생기는 경우가 있기 때문이다.



  • Dylan 2013.04.15 04:22

    주로 C++를 콘솔에서 사용하시느라 GUI를 사용하시지 않는 듯 하네요. 영국도 GUI보다 CUI를 좋아하는 골수 개발자가 많나요?

    • 에즈베어 곰발자 2013.04.15 09:32 신고

      안녕하세요 ^^ 그냥 개인적인 취향인것 같습니다. 마우스를 만지는게 귀찮은것도 이유중 하나지만 역시 가장 큰 이유는 리눅스를 깔기 싫어서인것 같습니다. 빌드환경을완벽하게 맞추지 못하는 이상 리눅스를 깔던 VM을 깔던 해야 GUI 빌드 환경을 구축할 수 있을텐데, 윈도우쪽개발도 아직 병행해야하고, VM에 깔아서 쓰는 이클립스는 약간 반응속도에 딜레이가 느껴져서 불편하게 느껴지네요.. 전에 넷빈즈하고 이클립스 한번 시도 해 봤는데, 그리 오래 가지 못하고 다시 vim으로 돌아왔습니다.

      그냥 vim의 split, tab 기능 그리고 ctag, cscope 그리고 몇가지 플러그인으로 약간의 불편함을 감수하면서 개발하고 있습니다. 그래도 한번쯤 GUI 환경 제대로 잡아서 써보고싶긴 합니다. 혹시 추천해주실만한것 있으신지요 ^^

  • Dylan 2013.04.15 17:28

    잘 하시는데 평범한 제가 뭘 추천까지 하기는 주제를 넘지 않나 싶은데요. ㅋ. 블로그 잘 보는 것으로 만족할께요~

  • 피디 2013.05.11 13:06

    svn 사용법을 익히고 있는 와중에 branch와 merge 쪽이 계속 적응이 힘들었었는데,
    잘 정리해서 주셔서 보고 갑니다.
    감사합니다.

  • 신후 2013.12.27 05:20

    고마워요, 잘 배우고 갑니다~

  • hjpark 2014.04.21 07:16

    딱 바로 쓸 수 있게 깔끔하게 정리해 주셔서 감사합니다!

  • 조이 2014.09.25 16:29

    잘 보았습니다. 몇 가지 궁금한게 있어서...

    1. 작업 완료한 branch는 그냥 남겨 놓나요? 아니면 merge한 이후에 지워버리나요?
    2. 지우지 않고 남겨 놓는다면, branch들이 너무 많아져서 remote repository의 branches 폴더에 여러 개발자가 만들어 놓은 branch들로 넘쳐나지 않나요?
    사소한 코드 픽스까지 브랜치를 만들어 사용한다면 더 그럴거 같은데.
    3. 만약 완료한 브랜치를 머지후에 지워버린다면, 그 브랜치에 있던 commit 로그들도 다 지워지겠죠? 트렁크에 머지 후에도 커밋로그를 유지할 방법이 있나요?

    • 에즈베어 곰발자 2014.09.29 11:11 신고

      1. 저희팀은 남겨놓습니다.
      2. 넘쳐납니다. ㅜ.ㅜ
      3. 없는것같습니다.

      저희는 팀 정책상 남겨놓지만,
      제 생각에는 꼭남겨놓을필요 없는것같습니다.
      개개인이 브랜치를 트렁크로 머징 할 때, 상세하게 요약해서 다시 커밋 정보를 적어주면 되니까요.
      여러명이서 함께 작업한 브랜치, 예를 들면 브랜치에서 서브 브랜치를 만들어서 여러명이 작업하거나 하는 경우만 제외하고는 지우는것도 괜찮을 것 같습니다.

  • 조이 2014.09.30 20:33

    감사합니다. 궁금하던게 풀렸습니다.

  • bjy 2017.08.28 07:54

    감사합니다 잘 배우고 갑니다 ㅎ