본문 바로가기

프로그래밍

SVN 사용시에 branch와 merge 잘 이용하기

(2014.02.20) 이 글은 개념을 익히기에는 도움이 되나, 이전에 익숙하지 않던 시절에 작성한것이기에 실무에 활용하기는 불편할 수 있습니다. 현재 편리하게 사용하고 있는 방법은 따로 작성해 두었습니다.

이전 회사에서 SVN을 사용할 때에는 main trunk에서 주로 작업을 했었다. 작은 팀이어서 각자가 담당하는 디렉토리를 다른사람과 공유할 일도 없고 하다보니 큰 문제는 발생하지 않았다. 일을 시작하기 전과 commit 하기 전에 svn update를 반드시 하기로 약속 했었고, 그런대로 잘 지켜 졌었던 것 같다.

영국에 온후로 윈도우 기반의 서버 개발을 하게 되었다. 회사에서는 오래전부터 써오단 Perforce라는 상용 버젼관리 툴을 사용해 오던 터라, SVN을 사용할 일은 전무 하였다. 그러다가 몇달 전, 새로운 프로젝트가 Linux 기반으로 결정됨에 따라서 다시 SVN과 함께 하게 되었다.

한국에서 하던것과 다른점 하나는, 무엇을 구현하던지 무조건 branch를 만들어서 하라는 것이었다. 개념이야 알고 있었지만 실제로 자주 써보지 않았으니 조금 막연하기도 하고, 한편으로는 코드 한두줄 고치는데도 branch를 만들어야 한다는게 비효율적인것 같았다. 하지만 내 예상외로, 프로젝트의 특성상 작은 코드라도 여러명이 함께 일하게 되는 경우가 상당히 잦았고, 그럴때마다 branch의 유용성을 실감하면서 지금껏 잘 쓰고 있다.

Branch를 만들어서 개발하고, 다시 Trunk에 merge 하는 과정은 단순한것 같으면서도 처음 시작할때는 그렇게 수월하지만도 않은것이 사실이다. 혹시나 이제 막 branch를 사용하려고 하는 사람들을 위해 간략히 정리해 보려고 한다.


1. Branch 생성

Branch를 생성하는것은 매우 간단하다. Trunk를 직접 복사하는 방법도 있으나 가장 효율적이고 확실한 방법은 아래와 같다.

$ svn copy svn+ssh://some_path/trunk \

           svn+ssh://some_path/branches/myBranch \

      -m "Creating my branch"


이렇게 생성된 branch는 checkout을 통해서 사용할 수 있다. 그리고 당연한 이야기지만 본인 말고 다른사람들은 사용할 리가 없으니 안전하다.

$ svn co svn+ssh://some_path/branches/myBranch



2. Branch에서 작업중

Branch에서 작업할 때에는 남들과 상관 없이 마음대로 commit 할 수 있어서 편리하다. 그런데 조금 귀찮은 것이 있다면, 주기적으로 Trunk의 변동 사항을 적용해 주는것이 좋다는 것이다. 미리미리 하지 않으면 나중에 둘이 함께 앉아서 resolving을 해야 하는 더욱더 귀찮은 상황이 발생할 수도 있으니 말이다.

Repositoy 설정이 잘 되어 있다면, Trunk의 변동 사항이 메일로 올것이다. 나는 그럴때마다 변동사항을 내 branch에 적용한다. 적용하는 방법은 간단히 아래와 같다.

$ cd myBranch
$ svn merge svn+ssh://some_path/trunk
  resolve conflicts
$ svn ci -m "Merging my branch with trunk" 


위와 같이하면, 현재 내 디렉토리에 다운로드 받아져 있는 Revision에 Trunk의 변동사항을 적용하게 된다. 이러한 과정을 Merge라고 부른다. 이때 Conflict 들이 발생할 수 있는데, 이를 모두 깔끔히 해결한 후 즉시 commit을 해두도록 한다.


3. Branch 작업 완료 후

Branch에서의 작업이 완료 되면, 이를 다시 Trunk에 적용해야 할것이다. 이부분이 가장 햇갈렸던 부분인데, 구글링을 하다보면 더더욱 햇갈린다. 적어도 나의경우에는 그랬다. 특히나 여러 사람에 의해 trunk에 많은 변경사항이 발생하여, 내 branch가 많이 달라져버린 경우라면 상당히 귀찮은 일들이 발생한다.

여러가지 방법이 있지만 나의 경우에는 다음과 같은 과정을 통해 Merge into trunk를 수행한다.

첫째, (2) 과정을 수행한다. 이 과정을 Merge into trunk 하기전에 반드시 해두어야만 나중에 Auto resolving이 불가능한 tree conflict를 예방할 수 있다.

$ cd myBranch
$ svn merge svn+ssh://some_path/trunk
  resolve conflicts
$ svn ci -m "Merging my branch with trunk before merging into trunk" 


둘째, 상위 디렉토리에서 Trunk를 하나 새로 checkout 한다. 이 때, 혼동되지 않도록 이름을 잘 짓는다.

$ cd ..
$ svn co svn+ssh://some_path/trunk temp_merge


셋째, repository path와 임시로 받아놓은 싱싱한 Trunk를 이용해 merge를 수행한다. 여기서 빨간 글씨로 써 져 있는 --dry-run은 merge command의 옵션중 하나인데, 이 옵션이 있으면 실제로 merge를 수행하지 않고 테스트만 해보는 것이다. 문제 없는 것 같으면 저 옵션을 제거하고 다시 실행하여 실제로 merge가 되도록 한다.

$ svn merge --dry-run svn+ssh://some_path/trunk \
            svn+ssh://some_path/branches/my_branch \
            temp_merge

if things look find for you

$ svn merge svn+ssh://some_path/trunk \
            svn+ssh://some_path/branches/my_branch \
            temp_merge  



Merge중에는 별의 별 이유로 별의 별 conflict들이 발생할 수 있지만, 첫째 과정을 제대로 수행했다면 conflict이 없어야 정상이다. 있으면 뭔가 이상한 것이니 첫째 과정을 다시 잘 수행하길 권한다. conflict 없는 깨끗한 복사본이 만들어지면, 이를 check in 한다.


$ cd temp_merge
Compile, check sanity... everything is ok? then, 
$ svn ci -m "Merging my branch into main trunk!"



Conflict를 해결하는 방법은 필요시에 적으려고 한다.

 


태그

  • 비밀댓글입니다

    • 앗 왜 이 리플을 지금 봤을까요 ^^
      이 글은 그다지 좋은방법은 아니어서 다른 글을 참고하시길 ..
      http://asbear.tistory.com/entry/SVN-branch-and-merge-%EC%89%BD%EA%B2%8C-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0-2

  • svn merge 구글링 타고 들어왔는데~ 이 글보다
    아주 잼나 영국취업기 잘 읽었습니다. :)

    • 안녕하세요 ^.^ 오래전일이라 저도 가물가물 하고 있었는데.. 뜻밖에 재밌게 읽어주셨다니 기분이 좋네요.. 좋은 하루 보내세요!!

  • 참새 2013.05.11 11:32 댓글주소 수정/삭제 댓글쓰기

    잘 보고 갑니다. 특정 프로젝트를 기반으로 하지만 새로운 버젼의 프로그램 개발이 필요할때도 이 branch기능을 사용하는게 적절한건지 모르겠네요. branch가 나중에 메인 trunk로 합쳐지는걸 전제하는거라면 좀 용도가 다를것 같은데요. 단순히 trunk를 clone하는게 더 맞는것 같기도 하구요.

    • 안녕하세요.. ^^ 이과정은 사실 예전에 브랜츠가 꼬이고꼬여서 도저히 머지가 안될때 최후에 썼던 방법이라 참고만 하셨으면 합니다.. ^^ 혹시나 참고하시려면 이 블로그에 다른 글이 있으니 그걸 봐주시구요.

      제 생각에도 branch는 아무래도 결국에는 trunk로 귀속되기 때문에 multi versioning에 적합하다는 생각은 별로 들지 않습니다. 그렇지만 client specific 기능이 추가된 버젼들이 생기는 경우에 branch를 만들어서 관리하는 시스코 팀을 봤습니다. 관리만 잘 하면 의도한대로 사용할수 있을거 같습니다. 저희팀도 새로운 기능 구현시 branch/sub-branch를 자주 활용하는데 몇개월식 sub-branch에서 작업하고 main branch로 merge하는 것과 trunk에서 main branch로 merge하는것을 반복했지만 큰 문제는 없었습니다. 일단 trunk의 clone이 생긴다는건 당장은 깨끗해 보일지 몰라도 공통분모를 잃음으로 인해서 추후 더 큰 고통이 뒤따를수도 있을것 같습니다.. 제 생각입니다. ^^

  • 나그네 2014.01.06 00:18 댓글주소 수정/삭제 댓글쓰기

    좋은 글 감사합니다.

  • 덕분에 branch 를 어떻게 머지할지 감이 잡혔습니다. 좋은글 감사합니다^^

    • 이 글은 한가지 방편일 뿐이고, 제가 현재 사용하는 방법은 다른 글에 적어 두었습니다 ^^
      http://asbear.tistory.com/entry/SVN-branch-and-merge-%EC%89%BD%EA%B2%8C-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0-2

  • egoodeed 2016.07.08 01:24 댓글주소 수정/삭제 댓글쓰기

    덕분에 안정적으로 merge 하는 방법에 대해 잘 배우고 갑니다.
    제가 국내 웹에서 찾아본 바로는 tortoise 같은 툴을 이용해서 svn 사용방법에 대해 설명하는 문서는 많이 볼 수 있는데 직접 터미널에서 svn merge 하는 방법에 이렇게 자세히 설명하신 글은 잘 볼 수 없었습니다.
    상세하게 잘 설명해주셔서 참 감사드립니다.

    • 오오 작은도움이되었다니 기쁩니다 ^^
      그나저나 전 GIT만 사용한지 몇년 지나니 다시 SVN으로 일하는게 엄두가 안나네요. 가능하면 프로젝트에 GIT을 도입해 보시는것도 추천드립니다.

  • isheejong 2017.04.06 06:43 댓글주소 수정/삭제 댓글쓰기

    branch 생성과 merge 를 좀더 편하게 하기 위해서 Git 나온게 아닌가 싶네요 ㅎㅎ

  • Dkpark 2017.09.04 01:10 댓글주소 수정/삭제 댓글쓰기

    branch 생성하고 trunk 와 머지하는 방법에 대해서 배우고 갑니다.
    게시글 감사합니다.ㅋ

  • KDS 2018.02.04 08:56 댓글주소 수정/삭제 댓글쓰기

    잘 보고 갑니다.~