2008년 11월 21일 금요일

Diff and Merge in SCM(Software Configuration Management)

에 관한 포스팅에 대하여 답변 겸 SCM에서의 Diff와 Merge에 대해서 글을 남겨 봅니다.

일단 헝그리맨님의 글에 대한 답변을 먼저 해야 겠군요.
사실 그동안 소스코드를 Diff하고 Merge하는데는 GUI Diff, Merge툴의 한글 깨지는 문제는 크게 신경을 쓰지 않았습니다.
  • 대부분의 소스코드는 거의 영어로 되어 있고, 
  • 주석에 일부 한글이 들어 갔어도 이부분이 수정되서 Diff, Merge가 필요한 부분이 거의 없었고,
  • 대부분의 머지는 줄단위로 이루어져서 줄 내에서 한글을 깨지게 표현하는 것은 사실 문제가 안되었습니다.
  • 3-way merge를 할때는 오랫동안 Unified diff를 사용했기 때문에 문제가 안되었습니다.
이것은 단지 한글 깨지는 것이 큰 이슈가 아니었다는 얘기입니다.
하지만 한글이 큰 이슈라면 AcroDiff나 WinMerge를 사용하시면 될 것 같습니다.
TortoiseSVN은 외부 Application을 등록하여 사용할 수 있도록 되어 있으니 한글(2byte)문자를 지원하는 AcroDiff나 WinMerge를 사용하세요. 
물론 Araxis Merge같은 상용제품을 사용하시면 금삼첨화지요.
Araxis Merge은 단순히 한글 지원 장점 외에도 3-way Merge를 지원하므로 제대로된 Merge Tool이라고 할 수 있습니다.
3-Way Merge를 지원하는 Merge Tool 중에서 무료로 사용할 수 있는 것은 KDiff3가 있습니다.
GPL 라이센스라서 무료이기는 하나 한글지원에서 약간 문제가 있습니다.
머지 기능 자체의 문제는 아니고 한글 부분이 약간 깨져서 보입니다만 Merge는 잘됩니다.
그래서 저는 KDiff3를 사용합니다.

얘기가 나온 김에 3-Way Merge가 무엇이며 왜 필요한지 "소프트웨어개발의 모든것"이라는 책의 내용을 잠시 소개하겠습니다.

 머지(Merge)
머지는 분기된 소스코드를 하나로 합치는 일이다머지를 능수능란하게사용할 수 있어야 소스코드관리시스템을 원활하게 사용할 수 있다.
머지는 크게 2-way 머지와3-way 머지로 나뉜다. 2-way 머지는 두 개의 파일을 가지고 서로 다른 부분을 비교하면서하나로 합치는 것이다이 방법은 100% 수동에 의존할수 밖에 없다서로 다른 부분 중 어느 것을 빼고 어느 것을 남겨야 하는지 어느 것이 옛날 내용이고어느 것이 새로 바뀐 것인지 직접 보고 판단해야 한다우리가 흔히 보는 머지툴의 대부분이 2-way 머지툴이다.


위 그림은 파일1과 파일2를합쳐서 파일3을 만들려는 것이다파일1과 파일는 원래는 하나의 파일이었으나 과거에 브랜치가 되어서 각각따로 수정된 것이다이 경우 어떻게 합쳐야 할 지 막막하다. B shark일지 monkey일지 판단하는 것이 쉽지 않다. F=mango는 새로 추가된 것인지 원래 있던 것이 반대 파일에서 삭제된 것인지 알기 어렵다따라서 소스코드를 잘 알고 있는 사람이 내용을 모두 보고 판단하는 수밖에 없는 것이다.
하지만 3-way 머지는 방법이 좀 다르다. 두 파일을 단순히 비교하는 것이 아니고 두 파일로 나누어지기 전의 파일도 같이 포함하여 비교하며 머지하는 것이다그렇게 되면 어떤 내용이 추가되거나 삭제되거나 변경되었는지를 알 수 있기 때문에 최종본으로 합치는 일이 훨씬수월하다파일의 충돌만 없다면 자동으로도 머지가 가능하다파일의충돌이 있을 경우에만 충돌된 부분을 사람이 판단하여 통합하면 되는 것이다.


여기서 새로 등장한 파일0은 파일1과파일2가 브랜치 되기 전의 원래 파일이다파일0, 파일1, 파일2를 각각비교하면파일1에서 monkey shark로 수정된 것을 알 수 있다파일2에서 apple은삭제되고 mango가 추가된 것도 알 수 있다이 정도면사람이 별도로 판단할 필요 없이 자동으로 머지가 가능하다. 이러한3-way 머지툴에는 다음과 같은 것들이 있다.
  • Perforce Merge
    • Publisher: Perforce software
    • License: 무료
  • Araxis Merge
    • Publisher: Araxis ltd.
    • License: 유료
  • KDiff3
    • Publisher: KDevelop
    • License: GPL
이 중에서 KDiff3는 인터넷을 통해서 쉽게 구하여 사용할 수 있다.


3-way 머지를 이용하면 또 다른 기능을 이용할 수도 있는데부분 머지(Range Merge)가 바로 그것이다예를 들어 브랜치를 하여 수정한 여러 부분에서 특정 부분만 트렁크와 머지를 하고 싶을 때가 있다고객의 요구에 의해 브랜치를 했고해당 브랜치에는 고객의 특별요구 기능이 반영이 되어 있었다그런 다음 브랜치에서 발견한 버그를 수정했는데이를 트렁크에도 반영하고 싶을 때가 있다이 경우에 3-way 머지를 이용하면 다른 부분은 빼고 버그를 수정한 부분만 골라서 머지를 할 수 있다.


소스코드관리시스템과 3-way 머지툴을 효과적으로 사용하면 머지작업이아주 효율적으로 진행된다그러나 3-way 머지가 매우유용한 방법인 것은 사실이나 100% 자동에 의존할 수는 없다.3-way 머지툴이 충돌없이 머지에 성공했다 하더라도그 결과를 눈으로 직접 확인하는것이 더욱 안전할 것이다.

댓글 14개:

  1. TortoiseSVN 1.5.5 버전에서는 깨지지 않고 잘 동작하는군요!
    여러 의견 주신 분들께 감사드립니다.
    Ray님, 브랜치 내용을 병합할때 3-way merge의 필요성을 아주 깔끔하게 정리해 주셨군요!
    참고로 AraxisMerge를 쓰고 있는데, 3-way merge는 프로페셔널 버전에서만 지원됩니다. 비싸요~
    TortoiseMerge는 공짜이면서 3-way merge를 지원하므로 이것만으로도 Subversion을 사용할 만한 가치가 있다고 생각됩니다. (게다가 1.5.5에서는 한글도 안 깨지구요 ^^)

    답글삭제
  2. 안녕하세요. 헝그리맨님
    1.5.5가 10월말에 릴리즈 되었군요.
    저도 설치를 했습니다. 한글 문제는 해결이 되었네요.

    TortoiseSVN이 3-way merge를 지원하기는 하나 머지창에 3개의 소스파일을 모두 보여주지 않고 Base File을 안보여 줘서 조금 불편하더군요. 그리고 Merge결과도 다른 여타 3-way merge보다 손이 더 많이 갑니다.

    다음 버전쯤에서는 본격적인 3-way merge툴과 같이 업그레이드가 되지 않을까 기대합니다.

    Araxis Merge가 좋기는 하나 워낙 비싸서 무료인 KDiff3를 권하는데 한글 문제가 있죠. 아직 0.9.92버전이니까 나중에 1.0 버전이 나올 때에는 해결이 되겠죠.

    답글삭제
  3. Diff/Merge 툴로 Araxis Merge 만큼 강력하면서도 좀 저렴한 Beyond Compare 라는 것도 있습니다. 더 저렴한 UltraEdit의 UltraCompare도 있구요.

    답글삭제
  4. 김선동님 안녕하세요.
    애들이 이쁘네요. :)
    Beyond Compare가 version 3부터 3-way merge를 지원하나보네요. 가격도 저렴하고 좋네요. UltraCompare도 좋네요. 좋은 정보 주셔서 감사합니다.
    블로그가보니 ID에 AcroEdit가 있군요. AcroEdit개발자이신가 보네요. 반갑습니다.
    AcroDiff도 발전시켜서 Enterprise급의 Merge툴로 만들면 어떨까요? ^^
    소프트웨어 개발에 관련된 많은 애기 나누면 좋겠습니다.

    답글삭제
  5. 링크타고 들어와서 좋은 블로그를 발견하고 바로 구독하고 있습니다. 전문가님들이 이렇게 나서주시니 저 같은 무지랭이 개발자에게는 많은 도움이 됩니다요. AcroDiff 는 걸음마 수준이라서 개선에 대해선 늘 생각만 하고 실행에 옮기지 못하네요..^^

    답글삭제
  6. 김선동님 안녕하세요.
    무슨 겸손의 말씀을:)
    AcroEdit 항상 관심을 가지고 주시하고 있습니다.
    우리나라에서도 세계적인 제품이 나와야죠.
    소프트웨어 업계에 오래 있으면서 아쉬운 점은 우리나라 개발자들은 대부분 글로벌하게 경쟁할 생각을 별로 안한다는 겁니다. 실력은 좋은데, 대부분 국내에서 어떻게 해볼까 생각을 합니다.
    다음 주제로 소프트웨어 개발에 있어서 Global mind에 대해서 적어볼까 생각하고 있었는데, 이참에 정리해서 글을 올려봐야겠네요.
    어쨋든 AcroEdit는 하기에 따라서 얼마든지 글로벌 경쟁력있는 제품이 될 수 있다고 생각합니다. 이제는 Open된 세상이기 때문에, 박스 실고 가서 팔아야 하는 시대는 아니기 때문에 누구에게나 기회는 있다고 생각합니다.
    아자~ ;)

    답글삭제
  7. 글로벌하게 하고 싶어도 영어가 문제죠...ㅎㅎ
    조금씩은 노력을 하겠지만 영어에 능숙하지 못하니 느릴수 밖에요...

    답글삭제
  8. AcroEditor는 세계에 내놔도 기능적으로는 경쟁이 충분히 될 수 있다고 생각합니다.
    제품을 Global화 할려면
    Software를 국제화(i18n), 지역화(L10n)해야하는데, 대부분의 개발자들이 이에 대해서 주먹구구식이더라구요. 나와 우리회사에서는 소프트웨어의 국제화에 전문적인 지식과 다양한 경험을 가지고 있습니다. 저의 Boss는 미국 선마이크로시스템즈의 제품 국제화 표준과 솔루션, 프로세스를 만드신 분입니다. 현재 전세계 대부분의 회사와 제품에서 그 표준을 따르고 있죠.
    그리고 Maketing이겠죠.
    제품의 국제화에 대해서 궁금하신 내용이 있으면 언제든지 연락주세요.
    감사합니다.

    답글삭제
  9. 3-Way Merge는 오늘 처음 알았습니다.+____+! 좋은 내용 정말 감사합니다~
    즐겁게 점심먹으러 갈수 있겠네요~ ^^

    답글삭제
  10. sozu님 안녕하세요.
    3-way merge 컨셉을 완벽하게 이해하기란 쉽지 않습니다. 제가 쓴 책(소프트웨어 개발의 모든 것)을 보시면 좀더 많이 이해되리라 생각합니다.

    답글삭제
  11. 와웅~ 감사합니다.^^ 저 책보는거 완전 좋아합니다.ㅋㅋ
    꼭 사서 보겠습니다~~

    답글삭제
  12. 그런데 Merge 후 충돌 났을 때 충돌된 라인의 구분과 충돌 해결 후 SVN에 어떻게 적용하나요?
    지금까지 SVN에 있는 기본 머지툴을 사용하다가 위 설명한 툴을 써보니 다 좋은데 그걸 모르겠다는;

    답글삭제
  13. 안녕하세요. 함수님
    직접 보면서 설명하면 간단한데 글로 설명하기는 어렵군요.
    우선 3Way Merge툴을 사용하셔야 합니다.
    각 툴은 SVN과 연결하는 방법이 안내가 되어 있습니다.
    TortoiseSVN의 External Merge툴에 등록을 하는 겁니다.
    그리면 SVN이 자동 Merge를 하다가 충돌이 나면 등록된 Merge툴이 실행됩니다. 3way merge툴의 기능을 이용해서 충돌을 해결하고 저장을 합니다.
    그리고 TortoiseSVN의 Update화면에서 "resolved" 체크를 한번 해줘야 합니다. 이부분이 가장 중요합니다.
    그러면 merge를 위해 생성되었던 임시 파일들이 모두 사라져서 Commit할 수 있는 상태가 됩니다.
    그리고나서 Commit을 하면 됩니다.

    답글삭제