레이블이 diff인 게시물을 표시합니다. 모든 게시물 표시
레이블이 diff인 게시물을 표시합니다. 모든 게시물 표시

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 머지툴이 충돌없이 머지에 성공했다 하더라도그 결과를 눈으로 직접 확인하는것이 더욱 안전할 것이다.