맨위로가기

머지 (버전 관리)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

머지는 버전 관리 시스템에서 두 개 이상의 변경된 파일이나 코드 조각을 통합하는 과정을 의미한다. 머지에는 비구조적 머지와 구조적 머지가 있으며, 자동 머지 툴은 2-way 머지와 3-way 머지를 수행하는데, 3-way 머지가 더 강력하고 신뢰성이 높다. 쓰리-웨이 머지는 널리 사용되는 머지 알고리즘으로, 파일 A와 B의 차이를 분석하고 공통 조상 C를 고려하여 병합을 수행한다. 머지 알고리즘으로는 삼방 병합, 재귀 삼방 병합, 퍼지 패치 적용, 위브 병합, 패치 교환 등이 있다. 한국에서는 Git, SVN과 같은 버전 관리 시스템과 함께 머지 도구가 널리 사용되며, GitHub, GitLab과 같은 플랫폼에서의 온라인 머지 기능 활용도 증가하고 있다. 다양한 머지 도구들이 개발되어 사용되고 있으며, Araxis Merge, Beyond Compare Professional, WinMerge 등이 있다.

2. 머지의 유형

머지에는 크게 비구조적 머지와 구조적 머지의 두 가지 유형이 있다. 자동 머지 도구가 수행하는 머지 처리 방식으로는 대표적으로 2웨이 머지(Two-way merge)와 3웨이 머지(Three-way merge)가 있으며, 일반적으로 3웨이 머지가 2웨이 머지보다 더 강력하고 신뢰성이 높은 것으로 평가된다.

2. 1. 비구조적 머지

비구조적 머지는 일반적으로 텍스트 줄을 원자 단위로 삼아 원시 텍스트에서 작동하는 방식이다.[1] 이는 유닉스 도구인 diff나 patch 등에서 사용되며, 버전 관리 시스템인 CVS, SVN, Git 등에서도 이 방식을 채택하고 있다.[1] 하지만 텍스트의 한 줄이 소스 코드의 구조를 직접적으로 나타내지는 않기 때문에, 이러한 방식은 기능적으로 제한적일 수밖에 없다.[1]

예를 들어, 두 개의 파일(가령 파일 A와 파일 B) 사이의 차이만을 분석하는 2웨이 머지(Two-way merge) 방식이 있다.[2] 이 기법에서는 머지를 수행하기 전에 두 파일 간의 차이점을 개별적으로 검토한 후, ''가장 타당한 추측''에 기반한 분석을 통해 머지된 결과 파일을 생성한다.[2] 그 결과, 2웨이 머지는 오류가 발생하기 쉬우며, 사용자가 머지 결과를 직접 확인하고 필요한 경우 수정해야 하는 경우가 많다.[2]

2. 2. 구조적 머지

구조적 병합 도구 또는 AST 병합은 소스 코드를 완전히 해결된 AST로 변환한다. 이를 통해 가짜 충돌을 방지하는 세밀한 병합이 가능하다.

3. 머지 알고리즘

자동 병합에는 여러 가지 접근 방식이 존재하며, 각각 미묘한 차이를 보인다. 주요 병합 알고리즘으로는 삼방향 병합, 재귀 삼방향 병합, 퍼지 패치 적용, 위브 병합, 패치 교환 등이 있다.

자동 머지 도구가 수행하는 병합 처리 방식은 크게 2-way 머지와 삼방향 병합(3-way merge)으로 나눌 수 있다. 일반적으로 삼방향 병합이 2-way 머지보다 더 강력하고 신뢰성이 높은 것으로 평가받는다.

3방향 병합 개략도. C는 공통 조상 파일, A와 B는 C에서 파생된 파일, D는 병합 결과 파일


삼방향 병합은 두 파일('A', 'B')과 이들의 공통 조상 파일('C')을 비교하여 변경 사항을 분석하고 통합하는 방식이다. 버전 관리 시스템에서는 공통 조상 파일이 명확하게 존재하는 경우가 많아 삼방향 병합을 적용하기에 적합하다. 이 방식은 신뢰성이 높고 대부분 자동으로 처리할 수 있어 널리 사용된다.

3. 1. 삼방향 병합 (Three-way merge)



삼방향 병합(Three-way merge)은 두 파일 'A'와 'B', 그리고 이들의 공통 조상 파일 'C'를 비교하여 변경 사항을 통합하는 방식이다.[2] 버전 관리 시스템에서는 파일 'A'와 'B'가 공통 조상 'C'를 가지는 경우가 많고, 조상 파일이 명확하므로 삼방향 병합을 적용하기에 적합하다. 병합 도구는 세 파일(A, B, C) 간의 차이와 패턴을 분석해 관계 모델을 생성하고, 이를 바탕으로 새로운 결과 파일 'D'를 만든다.

삼방향 병합은 다음과 같은 규칙에 따라 작동한다.

  • 두 파일의 내용만 같은 경우:
  • 'A'와 'C'의 내용이 같으면 'B'에서 변경된 내용이 결과 'D'에 반영된다.
  • 'B'와 'C'의 내용이 같으면 'A'에서 변경된 내용이 결과 'D'에 반영된다. (즉, 조상과 동일한 버전은 변경되지 않은 것으로 보고, 다른 버전의 변경 사항을 채택한다.)
  • 'A'와 'B'의 내용이 같은 경우: 두 파일 모두 변경이 없거나 동일하게 변경되었으므로, 해당 내용이 결과 'D'에 반영된다.
  • 세 파일('A', 'B', 'C') 모두 내용이 다른 경우: 이는 충돌(Conflict)로 간주된다. 시스템이 자동으로 결정할 수 없어 사용자가 직접 확인하고 수정해야 한다.


삼방향 병합은 하나의 공통 조상만 필요하므로 비교적 간단하면서도 널리 적용될 수 있다. 또한 신뢰성이 높고 실제 데이터에서도 잘 작동하며, 사용자의 개입을 최소화하면서 자동으로 병합을 처리할 수 있어 자동화에 유리하다.

이 방식은 널리 사용되는 diff3 프로그램에 구현되었으며, 과거 파일 잠금 방식에 의존했던 버전 관리 시스템이 병합 기반 시스템으로 발전하는 데 중요한 역할을 했다. 특히 CVS에서 광범위하게 사용되었다.

3. 2. 재귀적 삼방향 병합 (Recursive three-way merge)

세 방향 병합 기반의 버전 관리 도구는 널리 사용되지만, 이 기술은 기본적으로 병합할 버전들의 공통 조상을 찾는 데 의존한다.

특히, 수정된 버전들의 유일한 마지막 공통 조상이 존재하지 않는 "엇갈림 병합"[3]과 같은 까다로운 경우가 있다.

소프트웨어 버전 관리에서의 "엇갈림 병합" 문제. 왼쪽 절반에서 XY 두 영역이 수정되고 있다. X'X''는 순차적으로 수정된 버전이다. 해결책은 오른쪽 절반에 표시되어 있다: 가상 조상(점선 원)이 생성된다.


이 경우 최대 두 개의 가능한 조상 후보가 존재하는데, 재귀적 세 방향 병합은 이러한 고유하지 않은 조상들을 먼저 병합하여 ''가상 조상''을 만든다. 이 병합 과정 자체에서도 동일한 문제가 발생할 수 있으므로, 알고리즘은 이를 재귀적으로 처리하여 병합한다. 기록에 유한한 수의 버전만 존재하므로, 이 과정은 반드시 종료된다. 이 기술은 Git 버전 관리 도구에서 사용된다.

(Git의 재귀 병합 구현은 한 버전에서 수정되고 다른 버전에서 이름이 변경된 파일과 같은 다른 까다로운 경우도 처리하지만, 이는 세 방향 병합 구현의 확장일 뿐이며, 병합할 세 가지 버전을 찾는 기술의 일부는 아니다.)

재귀적 세 방향 병합은 도구가 병합될 파생물의 전체 조상 유향 비순환 그래프(DAG)에 대한 정보를 가지고 있을 때만 사용할 수 있다. 따라서 파생물이나 병합이 부모를 완전히 명시하지 않는 상황에서는 사용할 수 없다.

3. 3. 퍼지 패치 적용 (Fuzzy patch application)

패치는 파일의 변경 사항을 담고 있는 파일이다. 유닉스 환경에서는 텍스트 파일 변경 사항을 배포할 때 주로 diff 명령어의 `-u` 옵션으로 생성된 형식의 패치를 사용해왔다. 이 형식은 패치 프로그램을 통해 텍스트 파일이나 디렉토리 구조에 변경 사항을 적용하거나 제거하는 데 사용될 수 있다.

패치 프로그램은 패치를 만들 때 사용된 원본 파일과 내용이 정확히 일치하지 않는 파일에도 패치를 적용하는 기능을 가지고 있다. 이 과정을 퍼지 패치 적용(fuzzy patch application)이라고 부른다. 퍼지 패치 적용은 일종의 비대칭 삼방 병합 방식으로 작동하며, 패치 프로그램이 변경 사항을 적용할 정확한 위치를 찾지 못하면 해당 변경 내용은 버려진다.

GNU arch는 diff3 기반의 스크립트 모음으로 시작한 CVS처럼 패치를 기반으로 한 스크립트 모음으로 시작했다. 하지만 퍼지 패치 적용은 비교적 신뢰성이 낮은 방법으로 평가받는다. 특히, 변경된 맥락 정보가 너무 적은 패치(예: 새로운 파일을 추가하는 패치)를 잘못 적용하거나, 병합하려는 두 버전 모두에서 특정 내용이 삭제된 경우 해당 삭제를 제대로 반영하지 못하는 문제가 발생할 수 있다.

3. 4. 패치 교환 (Patch commutation)

패치 교환은 변경 사항을 병합하기 위해 Darcs에서 사용되며, git에서도 "리베이스(rebase)"라는 이름으로 구현되어 있다. 패치 교환 병합은 패치(즉, 변경 사항 설명)의 순서를 변경하여 선형적인 히스토리를 형성하는 것을 의미한다. 실제로 공통적인 상황에서 두 개의 패치가 만들어지면, 병합 시 그중 하나를 다른 패치의 컨텍스트에서 수행된 것처럼 다시 작성한다.

패치 교환을 위해서는 파생된 파일을 변경한 정확한 변경 내용이 저장되거나 재구성될 수 있어야 한다. 이러한 정확한 변경 내용으로부터 다른 패치에 리베이스하기 위해 그중 하나를 어떻게 변경해야 하는지를 계산할 수 있다. 예를 들어, 패치 A가 파일 F의 7행 뒤에 "X"라는 줄을 추가하고 패치 B가 파일 F의 310행 뒤에 "Y"라는 줄을 추가하는 경우, B는 A에 리베이스될 때 다시 작성되어야 한다. A에서 추가된 줄이 줄 번호를 하나씩 밀어내므로, 파일 F의 311행에 줄을 추가하도록 수정되어야 한다.

패치 교환은 형식적으로 많은 연구가 이루어졌지만, 패치 교환에서 병합 충돌을 처리하는 알고리즘은 여전히 열린 연구 문제이다. 그러나 패치 교환은 다른 병합 전략이 사용자가 보고 싶어하는 것을 생성하려는 일종의 휴리스틱인 반면, "정확한" 병합 결과를 생성한다는 것을 증명할 수 있다.[4]

"patchutils" 패키지의 유닉스 프로그램 `flipdiff`는 diff -u로 생성된 기존의 패치에 대한 패치 교환을 구현한다.

최근에는 아래와 같은 새로운 머지 알고리즘이 개발되어 사용 빈도가 높아지고 있다.

  • Darcs의 패치 순서 변경 기능
  • Codeville의 히스토리를 이용한 2-웨이 머지

3. 5. 위브 병합 (Weave merge)

위브 병합은 두 파일의 공통 조상 파일을 사용하지 않고 병합하는 알고리즘이다. 대신 파일의 여러 파생 버전에서 개별 이 어떻게 추가되고 삭제되었는지를 추적하고, 이 정보를 바탕으로 병합된 파일을 생성한다.

파생된 파일의 각 줄에 대해 위브 병합은 다음 정보를 수집한다:

  • 어떤 줄이 해당 줄 앞에 오는지
  • 어떤 줄이 해당 줄 뒤에 오는지
  • 두 파생 버전의 기록 중 어느 시점에서 해당 줄이 삭제되었는지 여부


만약 어느 한 파생 버전에서라도 특정 줄이 삭제된 기록이 있다면, 그 줄은 최종 병합된 버전에 포함되지 않는다. 삭제되지 않은 다른 모든 줄은 병합된 버전에 포함되어야 한다.

줄들은 기록상의 특정 시점을 기준으로, 자신보다 앞에 있었던 모든 줄 뒤에 오고, 자신보다 뒤에 있었던 모든 줄 앞에 오는 순서로 정렬된다. 만약 이러한 제약 조건만으로는 모든 줄의 전체 순서를 결정할 수 없다면, 서로 정렬되지 않은 줄들은 충돌하는 추가 사항으로 간주된다.

위브 병합은 상업용 버전 관리 도구인 비트키퍼에서 사용되었던 것으로 보이며, 삼자 병합 방식이 잘못되거나 좋지 않은 결과를 내는 일부 문제 상황을 처리할 수 있다는 장점이 있다. 또한, GNU 바자 버전 관리 도구의 병합 옵션 중 하나이며, 코드빌(Codeville)에서도 사용된다.

4. 머지 도구 목록

버전 관리 시스템에서 코드나 문서의 변경 사항을 합치는 머지 작업을 돕기 위해 다양한 도구들이 개발되어 사용되고 있다. 이러한 도구들은 크게 상용 소프트웨어오픈 소스 소프트웨어로 나눌 수 있으며, 각기 다른 기능과 특징을 제공한다. 주요 머지 도구에 대한 자세한 정보는 아래 하위 섹션에서 확인할 수 있다.

4. 1. 상용 머지 도구


  • 애플(Apple) FileMerge: NeXT의 Merge에서 파생된 macOS용 개발 도구.
  • Araxis Merge: 2방향 및 3방향 파일 비교, 병합, 폴더 동기화를 수행할 수 있다. 윈도우 및 macOS에서 작동하며, 일본어를 지원한다.[5]
  • Beyond Compare Professional: 폴더 및 파일 비교·동기화와 3방향 병합을 수행할 수 있다. macOS, 윈도우, 리눅스에서 작동한다.[6]
  • Compare++: 고기능 소스 코드용 diff 유틸리티로, C/C++, Java, C#, Javascript, CSS 등의 소스 코드에 대해 구조화된 비교 및 병합을 수행할 수 있다.[7]
  • DeltaWalker Oro: 파일 및 폴더의 비교, 병합, 동기화를 2방향 및 3방향 모두로 실행할 수 있다. macOS, 윈도우, 리눅스에서 작동한다.[8]
  • DiffMerge: SourceGear에서 제공하는 파일 및 폴더 비교/병합 도구.
  • ECMerge: 텍스트, 이미지, 디렉토리에 대한 2방향 및 3방향 diff 및 병합을 수행할 수 있다.[9]
  • ExamDiff Pro: 디렉토리, 바이너리 파일, 텍스트 파일의 비교를 수행할 수 있다.[10]
  • Guiffy SureMerge: 파일 비교, 폴더 비교 및 병합을 수행할 수 있다. macOS, 윈도우, 리눅스에서 작동한다.[11]
  • MergePlant: 3방향 병합 도구이다.[13]
  • SimMerge: Simulink 모델용 3방향 병합 도구이다.[14]
  • SourceGear DiffMerge: 파일 및 폴더의 비교 및 병합용 도구로, 3방향 병합도 수행할 수 있다. macOS, 윈도우, 리눅스에서 작동한다.[15]
  • UltraEdit UltraCompare: [16]
  • medini unite: Matlab의 Simulink 및 Stateflow 모델용 3방향 diff 및 병합 도구이다.[17]

4. 2. 오픈 소스 머지 도구


  • WinMerge: 윈도우 환경에서 사용할 수 있는 무료 오픈 소스 그래픽 파일 비교 및 병합 도구이다.
  • diff3: 다양한 유닉스 계열 운영체제에서 사용할 수 있는 3방향 병합 도구이다.
  • KDiff3: 3방향 병합을 지원하는 도구이다[12]
  • meld
  • tkmerge
  • xxdiff: 그래픽 인터페이스를 통해 파일 및 디렉토리를 비교하고 병합할 수 있는 도구이다[18]

4. 3. 기타 머지 도구


  • 애플(Apple) FileMerge: NeXT의 Merge에서 파생된 macOS용 개발 도구이다.
  • Araxis Merge: 2방향 및 3방향 파일 비교, 병합, 폴더 동기화를 수행할 수 있다. 윈도우 및 macOS에서 작동하며, 일본어를 지원한다.[5]
  • Beyond Compare: Professional 버전은 폴더 및 파일 비교·동기화와 3방향 병합을 수행할 수 있다. macOS, 윈도우, 리눅스에서 작동한다.[6]
  • Compare++: 고기능 소스 코드용 diff 유틸리티로, C/C++, Java, C#, Javascript, CSS 등의 소스 코드에 대해 구조화된 비교 및 병합을 수행할 수 있다.[7]
  • DeltaWalker: Oro 버전은 파일 및 폴더의 비교, 병합, 동기화를 2방향 및 3방향 모두로 실행할 수 있다. macOS, 윈도우, 리눅스에서 작동한다.[8]
  • ECMerge: 텍스트, 이미지, 디렉토리에 대한 2방향 및 3방향 diff 및 병합을 수행할 수 있다.[9]
  • ExamDiff Pro: 디렉토리, 바이너리 파일, 텍스트 파일의 비교를 수행할 수 있다.[10]
  • Guiffy: SureMerge는 파일 비교, 폴더 비교 및 병합을 수행할 수 있다. macOS, 윈도우, 리눅스에서 작동한다.[11]
  • KDiff3: 3방향 병합 기능을 제공하는 도구이다.[12]
  • MergePlant: 3방향 병합 기능을 제공하는 도구이다.[13]
  • SimMerge: Simulink 모델을 위한 3방향 병합 도구이다.[14]
  • SourceGear DiffMerge: 파일 및 폴더의 비교 및 병합용 도구로, 3방향 병합도 수행할 수 있다. macOS, 윈도우, 리눅스에서 작동한다.[15]
  • TortoiseMerge: TortoiseSVN 등에서 사용되는 병합 도구이다.
  • UltraCompare: 파일 및 폴더 비교 기능을 제공하는 도구이다.[16]
  • WinMerge: 무료 오픈 소스 그래픽 윈도우용 diff 및 병합 도구이다.
  • diff3: 각종 Unix 계열 시스템에서 사용할 수 있는 기본적인 3방향 병합 도구이다.
  • medini unite: Matlab의 Simulink 및 Stateflow 모델을 위한 3방향 diff 및 병합 도구이다.[17]
  • meld: 시각적인 diff 및 병합 도구이다.
  • tkmerge: Tk 기반의 병합 도구이다.
  • xxdiff: 그래픽 파일 및 디렉토리 비교 및 병합 도구이다.[18]

참조

[1] 문서 Help:Edit conflict#Prevention
[2] 서적 Proceedings of the 2004 ACM symposium on Document engineering ACM Press 2004
[3] 간행물 The criss-cross merge case https://lore.kernel.[...] 2005-04-28
[4] 웹사이트 Some properties of Darcs patch theory https://urchin.earth[...]
[5] 웹사이트 Araxis: Software for Productive People https://www.araxis.c[...]
[6] 웹사이트 Scooter Software: Home of Beyond Compare https://www.scooters[...]
[7] 웹사이트 http://www.coodesoft[...]
[8] 웹사이트 Deltopia - Compare/Merge Files and Folders with DeltaWalker https://www.deltopia[...]
[9] 웹사이트 Ellié Computing - Home of the advanced diff and merge tool - ECMerge http://www.elliecomp[...]
[10] 웹사이트 ExamDiff Pro - Compare and merge files, directories, documents, archives, and binary files with this visual diff utility, the engine of DiffNow https://www.prestoso[...]
[11] 웹사이트 Guiffy - Diff Merge tool & Folder Compare application and API https://www.guiffy.c[...]
[12] 웹사이트 http://kdiff3.source[...]
[13] 웹사이트 http://www.mikado-lt[...]
[14] 웹사이트 http://www.ensoftcor[...]
[15] 웹사이트 SourceGear | DiffMerge https://www.sourcege[...]
[16] 웹사이트 Compare Files, Folders, Text | UltraCompare https://www.ultraedi[...]
[17] 웹사이트 http://www.ikv.de
[18] 웹사이트 xxdiff: Graphical File And Directories Comparator And Merge Tool http://furius.ca/xxd[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com