2009년 2월 25일 수요일

Merge Tool(머지툴) 비교 - (3way merge 기능) - 수정

소프트웨어를 개발하다 보면 소스코드의 브랜치가 일어나고 이를 Merge(머지)하는 일은 피하기가 어렵습니다.
이 Merge(머지)과정을 자동화 툴을 이용하면 상당히 많은 시간을 절약할 수 있습니다.
특히 Merge의 자동화를 위해서는 3way-Merge가 필수적인데, 시중에서 3way머지가 지원된다고 하는 툴 4가지와 SVN에서 지원하는 Unified diff, 이렇게 총 5가지를 비교해봤습니다.
그 결과는 아래와 같이 평가를 하였습니다. KDiff3, P4Merge와 Araxis Merge가 우수하게 나왔습니다.

2way merge툴은 같은 레벨에서 비교 대상이 되지 않기 때문에 비교하지 않았습니다. 2way merge툴보다는 꼭 3way merge툴을 쓰기를 권장합니다.

3way merge툴은 실무에 있어서 2way merge툴보다 10배에서 100배까지 더 효율적입니다. 직접 이해를 하고 써보기 전까지는 짐작하기 어려울 정도입니다.

제 책(소프트웨어 개발의 모든 것)에서 3way merge에 대해서 자세히 설명하고 있으니 참조하기시 바랍니다.


 총점



 비교 데이터

비교 방법은 일부러 Conflict가 일어나는 상황을 만들어서 각 Merge툴이 얼마나 손쉽게 Conflict를 해결하는지 비교하였습니다.

제가 분석을 위해서 사용한 파일은 다음과 같습니다.


위에서 자동으로 Merge가 가능한 부분은 노란색으로 칠했고, Conflict가 나는 부분은 보라색으로 칠했습니다.
이렇게 Conflict를 일으켜서 SVN에서 자동 Merge를 실패하게 한 후에 각각의 Merge툴로 비교를 해 봤습니다.


 실행
KDiff3와 Araxis Merge는 Conflict가 났을 때 SVN에 떨궈주는 파일 3개를 선택해서 쉽게 해당 툴을 실행할 수 있습니다. 그래서 Merge하는 시간을 절약할 수 있습니다.

KDiff3


Araxis Merge


 비교 화면

비교는 Orginal File(Base)과 Trunk File(Working)과 Branch File 3개를 비교했습니다.
그 화면은 다음과 같습니다. 이미지를 클릭하면 큰 이미지를 볼 수 있습니다.
언뜻 보기에는 각각의 화면이 크게 차이가 나지 않는 것처럼 보입니다. 각 툴마다 다른 부분, Conflict가 나는 부분을 다른 방법으로 표시를 하고 있습니다. KDiff3는 한글이 깔끔하게 나오는 것이 눈에 좀 거슬리지만, 기능에는 문제가 없습니다.
비교 화면에서는 Araxis Merge가 가장 직관적이고 깔끔한 화면을 보여줍니다.

KDiff3

P4Merge

Araxis Merge

Beyond Compare

Ultra Compare


Merge시 Conflict를 알려주는 다이얼로그 

KDiff3와 Araxis Merge는 의미있는 Conflict 정보를 Merge시 알려줍니다. 둘다 자동 Merge를 하면서 Conflict가 난 2건을 표시해 줍니다.
P4Merge는 가장 직관적인 화면을 보여주며 마찬가지로 Conflict 2건을 표시합니다.

KDiff3
 
P4Merge

Araxis Merge
 

Merge 화면

Merge를 실행하게 되면 KDiff3, P4Merge와 Beyond Compare는 원래 파일 3개는 그대로 두고 새로운 Merge파일 창이 새로 생깁니다. 하지만, Araxis Merge와 Ultra Compare는 기존의 파일을 수정하도록 되어 있네요.
P4Merge가 가장 직관적입니다.

KDiff3

P4Merge

Araxis Merge
 
Beyond Compare
 
Ultra Compare
 

Conflict 해결

Conflict는 각각 어떻게 해결을 할 수 이나 비교를 해 봤습니다.

KDiff3 - Merge화면에서 Conflict가 난 줄은 <Merge Conflict>라고 표시가 됩니다. 원래 비교 대상인 3개의 파일 중에서 하나를 마우스나 키보드를 이용해서 선택할 수 있습니다.
 
P4Merge - Merge창에서 Conflict가 난 부분은 붉은 표시가 되어 있습니다. 오른쪽에 있는 버튼을 클릭해서 원하는 부분은 클릭하면 쉽게 Conflict가 해결됩니다.

Araxis Merge - Conflict가 난 줄들은 줄 앞에 빨간 동그라미가 나옵니다. 해당 줄에서 >>, << 버튼을 이용해서 선택을 하면 됩니다.
 
Beyond Compare - Conflict가 일어난 줄은 붉은 바탕으로 표시가 됩니다. 이 줄에서 마우스 버튼을 이용해서 원하는 파일을 선택하면 적용이 됩니다. 테스트 시 라인 단위로 정교하게 선택이 안되고 뭉쳐서 선택이 되는 바람에 원하는대로 Merge를 하는데 시간이 좀 걸렸습니다.
 
Ultra Compare - Conflict는 표시가 안됩니다. 그냥 서로 다른 줄을 찾아서 ->, <-버튼을 이용해서 선택하면 됩니다. 자동 Merge가 안되서 수동으로 일일이 선택을 해줘야 합니다.


Unicode 지원

KDiff3 - Unicode를 지원하나 Auto detect가 잘 안되네요.
P4Merge - Unicode를 완벽하게 지원합니다.
Araxis Merge - 지원한다고 하는데, View에서 깨져 보임,  Merge는 됨 
Beyond Compare - View, Merge 모두 지원
Ultra Compare - View, Merge 모두 지원

총평

기능면에서는 약간 부족함은 있으나, 기본적인 Merge기능에 충실하고 가격이 무료인 KDiff3와 모든 기능이 우수하지만 가격이 좀 부담스러운 Araxis Merge에 높은 점수를 주었습니다.
그리고 P4Merge는 Merge 기능이 가장 직관적인고 편리합니다. 

실제로 Merge결과 원하는 결과대로 바로 Merge가 되면서 Conflict를 몇 초만에 해결할 수 있었던 것은 KDiff3, P4Merge와 Araxis Merge밖에 없었습니다.

Branch와 Merge가 빈번하고 회사에 경제적인 여유가 된다면 Araxis Merge가 적당할 것 같고, 그렇지 않은 경우라면 다른 유료 툴보다도 KDiff3와 P4Merge가 좋을 것으로 생각합니다.

댓글 26개:

  1. KDiff3는 무료인데 최고점이군요. :)

    답글삭제
  2. 안녕하세요. 영회님
    3way-merge 기능을 위주로 비교했기 때문입니다. 그리고 Araxis Merge가 기능이 더 좋기는 하지만, 가격 점수 때문에 그렇게 평가를 했습니다.

    답글삭제
  3. 유용한 글 고맙습니다.
    SVN의 Unified Diff 는 TortoiseDiff 와 같은 것인지요?

    답글삭제
  4. 저는 보통 단순히 2개의 파일비교를 위해 winmerge를 사용하는데
    3-way merge 라는 것과 새로운 툴들 정보 잘 봤습니다.^^

    답글삭제
  5. 언제나 유익한글 감사드립니다. 최근에 가장 자주오게되는 블로그네요.^^ 저도 현재 급한 프로젝트때문에 ClearCase를 사용하는 회사임에도 너무나 자주바뀌는 코드로인해 WinMerge를 통하여 급 머지를 하고있습니다.-_- 머지에 대해서 좀 자세하게 알고싶은데요.. 왜 3 way merge가 필수인가요? 아직 3 way merge에 대한 개념이 잘없네요. Tunk,와 Branch의 개념도 알고싶습니다. 감사합니다

    답글삭제
  6. 헝그리맨님 안녕하세요.
    Unified Diff는 Text포맷으로 Merge를 할 수 있는 하나의 Format입니다. SVN과 TortoiseSVN에서 기본적으로 제공합니다. GUI가 불편하므로 GUI가 편리한 다른 툴들을 사용하는 것이고요.

    답글삭제
  7. 창천님 안녕하세요.
    Winmerge같은 2way merge의 한계는 모든 것이 수동이라는 것이지요.

    답글삭제
  8. Perforce의 P4Merge도 무로이면서 좋은 3-way merge tool중에 하나라고 생각됩니다.
    http://www.perforce.com/perforce/products/merge.html

    답글삭제
  9. 뽕삼님 안녕하세요.
    http://allofsoftware.net/entry/Release-Branch-Function-Branch-and-Customer-Branch 과 http://allofsoftware.net/entry/diffandmerge 를 읽어보세요. 더 궁금한 것이 있으면, Email을 보내주세요.

    답글삭제
  10. popopome님 안녕하세요.
    P4Merge가 빠졌군요. 이것도 Evaluation에 추가를 할까 합니다. 감사합니다.

    답글삭제
  11. 좋은 내용 감사합니다. 최근 반년간 거의 excel로만 작업을 했더니 코딩이 가물 가물 거리는 군요... ^^:

    답글삭제
  12. 정의의소님 안녕하세요.
    경력이 쌓일 수록 코딩일은 점점 줄어들더군요. 그래도 코딩은 언제나 재미있죠. ^^

    답글삭제
  13. p4 merge툴 자체는 무료라고 하는데.. 가격이 ㄷㄷㄷ..
    http://perforce.com/perforce/products/merge.html

    답글삭제
  14. 안녕하세요. kkurrung님 블로그에 오류가 있네요. 지금 다시 확인해보니, Perfoce Merge는 무료네요. 제가 적어 놓은 것은 서버의 가격이네요. 수정하도록 하겠습니다. 지적해주셔서 감사합니다.

    답글삭제
  15. 국산 3 Way Merge 도구도 있습니다. (물론 우리팀이 만들고 있고, 상용입니다. :)
    http://www.snh.co.kr/?s=product&m=shape4 여기에서 평가판을 받으실수 있습니다.

    물론, 우리팀은 Merge Tool만을 전문적으로 만들지 않고, 형상관리에 관련된 전반적인것을 함께 개발하고 있기때문에, 총력을 다하고 있지만 못합니다만. 국산제품도 있다는 점을 알려드리고 싶어요...

    답글삭제
  16. 머샤머샤님 안녕하세요.
    개발을 하시면서 소스코드관리시스템은 물론 실루엣을 쓰시겠죠? ^^ 이런류의 질문들이 항상 궁금했습니다. ㅎㅎ 나중에 기회가 되면 같이 검토를 해봐야겠네요.

    답글삭제
  17. araxis가 좋긴한데.. syntax highlight가 안되서 간간히 winmerge를 사용하고 있습니다만
    디렉토리 비교 측면에서는 araxis가 좋더군요. 3way까지 잘 쓰질 않아서 유용한지는 잘 모르겠습니다 ^^;

    답글삭제
  18. 구차니님 안녕하세요.
    3-way merge를 사용하지 않을 거면 winmerge로 충분하죠. 소프트웨어를 개발하다보면, 브랜치, 머지, 롤백 등 수많은 상황에서 3-way merge는 이런 활동을 몇배 편하게 해줍니다. 3-way merge도 익숙해질 필요가 있습니다.

    답글삭제
  19. 우연히 지나다 글을 보고 남깁니다. 저도 kdiff3를 자주 씁니다만, 단순히 text merge할 때는 diffmerge를 사용합니다. 비교 대상에 없다는 게 안타깝습니다. free고 cross platform이면서 사용도 편한 꽤 좋은 tool입니다.

    답글삭제
  20. 오랫만에 글 남깁니다. 혹시 SourceGear의 DiffMerge는 사용하지 않으시나요? :D

    답글삭제
  21. 우울한 딱따구리님 오랫만입니다. ^^
    DiffMerge는 아직 사용해보지는 않았습니다.
    기회가 되면 한번 Evaluation을 해보도록 하겠습니다.
    요즘 워낙 바빠서 짬이 안나고 있습니다. - -;

    답글삭제
  22. 오타가! detact

    좋은 글들 잘 읽고 있습니다.

    답글삭제
  23. 참 merge 의 세계가 오묘하군요
    git 을 만든 linus torvalds 도 merge 를 오랫동안 고민했다고 하더군요.
    일반적인 버전관리 툴들은 파일이름을 바꾸거나 했을 때 병합시키면 잘 추적을 못하지만
    git 은 3-way merge 는 기본이고 git 자체의 휴리스틱 기능을 써서 파일까지도 추적한다고 하더라구요ㅎ
    merge 가 참 재밌는 분야인거 같습니다.

    답글삭제
  24. 안녕하세요. redred님
    3-way 머지를 능수능란하게 사용하려면 원리를 빠삭하게 알아야 합니다. 그리고 개발을 하면서 파일 이름을 바꾸는 것 자체가 문제가 있다고 생각합니다. 일단 개발해놓고 때에 따라서 파일 이름을 바꾸면 안됩니다.
    그래도 이런 일이 발생하기 때문에 git에서 고민한 흔적이 보입니다.

    답글삭제
  25. 2017년 3월 현재 기준의 비교가 궁금합니다.

    각 소프트웨어 버전업도 많이 되었을 것이고
    자료 뒤져보면 Beyond Compare 가 좋은 말이 많던데
    본 게시글에서는 점수가 낮네요. ㅠ,ㅠ;

    혹 현 시점 기준으로 현행화 가능하신지 살짝 여쭤 봅니다.

    답글삭제
  26. 여기가 성지군요...개발자들이 답을 찾을 때 10년도 넘고 아무도 안 볼 것 같은 티스토리같은 블로그들을 본다는데 역시 재야의 고수입니다.

    답글삭제