3 방향 병합이 2 방향 병합보다 유리한 이유는 무엇입니까?


답변:


259

나와 친구가 파일을 체크 아웃하고 파일을 변경했다고 가정 해 보겠습니다. 처음에 줄을 제거하고 친구가 끝에 줄을 추가했습니다. 그런 다음 파일을 커밋 한 후 변경 사항을 사본에 병합해야합니다.

양방향 병합 (즉, diff)을 수행하는 경우 도구는 두 파일을 비교하여 첫 번째 행과 마지막 행이 다른 것을 확인할 수 있습니다. 그러나 차이점과 어떻게 관련이 있는지 어떻게 알 수 있습니까? 병합 된 버전에 첫 번째 줄이 포함되어야합니까? 마지막 줄을 포함해야합니까?

3 방향 병합을 사용하면 두 파일을 비교할 수 있지만 파일을 변경하기 전에 각 파일을 원본과 비교할 수도 있습니다. 따라서 첫 번째 줄을 제거하고 친구가 마지막 줄을 추가했음을 알 수 있습니다. 그리고이 정보를 사용하여 병합 된 버전을 생성 할 수 있습니다.


"하지만 차이점을 어떻게 처리 할 수 ​​있을까요?" 얻지 못했습니다. 두 파일 사이의 차이점을 이미 볼 수 있다면 (원본을 참조하지 않고) 왜 파일 타임 스탬프의 순서대로 두 변경 사항을 순차적으로 적용 할 수 없습니까? 즉, 그것은 친구의 커밋 된 사본으로 시작하여 (새로운) 원본 (맨 위에 줄 추가)으로 만든 다음 맨 위에 내 로컬 변경 사항 (botton에서 줄 삭제)을 적용합니다.
해리

7
@Harry 원본에 세 줄 (ABC)이 있다고 가정합니다. 내 친구의 사본 (ABCD)으로 시작하여 내 (BC)와 비교합니다. 원본을 보지 않고 A와 D를 모두 제거한 것으로 최종 결과는 BC 여야한다고 생각할 수 있습니다.
JW.

80

퍼 포스 프리젠 테이션 의이 슬라이드 는 흥미 롭습니다.

슬라이드 이미지

3 방향 병합 도구의 필수 논리는 간단합니다.

  • 기본, 소스 및 대상 파일 비교
  • 소스 및 대상 파일 파일에서 "청크"를 식별하십시오.
    • 베이스와 일치하지 않는 덩어리
    • 베이스와 일치하는 덩어리
  • 그런 다음 다음으로 구성된 병합 결과를 구성하십시오.
    • 세 파일 모두에서 서로 일치하는 청크
    • 소스 또는 대상의베이스와 일치하지 않지만 둘 다의베이스와 일치하지 않는 청크
    • 베이스와 일치하지 않지만 서로 일치하는 청크 (즉, 소스와 대상 모두에서 동일한 방식으로 변경됨)
    • 충돌하는 청크에 대한 자리 표시자가 사용자에 의해 해결됩니다.

이 그림에서 "청크"는 순전히 기호입니다. 각각은 파일의 행이나 계층의 노드 또는 디렉토리의 파일을 나타낼 수 있습니다. 그것은 모두 특정 병합 도구가 무엇을 할 수 있는지에 달려 있습니다.

2 방향 병합에 비해 3 방향 병합이 어떤 이점을 제공하는지 묻습니다. 실제로, 양방향 병합과 같은 것은 없으며, 두 파일을 서로 구분하여 한 파일 또는 다른 파일에서 청크를 선택하여 "병합"할 수있는 도구 만 있습니다.
3 방향 병합만으로 청크가 원점에서 변경되었는지 여부와 변경 사항이 충돌하는지 여부를 알 수 있습니다.


"변경 충돌 여부에 관계없이." -양방향 병합 (diff)도 충돌을 표시하지 않습니다 (충돌의 원인으로 정보가 손실 되기는하지만) /
Vlad

1
그러나 Git에서는베이스가 실제로 동일하지 않은 4 웨이 병합을 갖는 것이 일반적입니다. 여전히 3 방향 병합이 더 좋고 양방향입니다.
Wernight

@Wernight, 5 방향 병합이 있습니까?
Pacerier

@Pacerier 내가 아는 것은 아니지만 git cherry-pick 또는 rebase 중에 실제로 일어나는 일입니다.
Wernight

매우 상세하고 유용한 설명
Kaneg

20

나는 그것에 대해 매우 자세한 게시물을 썼습니다 . 기본적으로 양방향, 매우 비생산적인 삭제 / 추가를 추적 할 수 없습니다.


@pablo, X 앞에 함수를 추가하고 X 뒤에 다른 함수를 추가하고 세 가지 방법으로 병합하면 도구가 자동으로 두 변경 사항을 적용합니다. 그러나 변경 사항이 실제로 변경 사항과 충돌하면 어떻게됩니까 (예 : 우리 각자가 동일한 기능 이름으로 새 함수를 작성 함)? 자동 합병은 "지루하게 쉬운"합병이 실제로 충돌을 일으킬 수 있다는 것을 어떻게 알 수 있습니까?
Pacerier

1
튜토리얼을 읽으면 정말 도움이됩니다. 나는 당신이 묘사 한 개발자들과 같은 느낌입니다. 저는 항상 3 방향 병합을 두려워했습니다.
racl101

3
기사의 일부를 복사하여 붙여 넣는 것이 좋습니다. 나는 이것이 당신이 투표를 얻는 데 도움이 될 것이라고 생각하며 스택 오버 플로우 철학에 더 잘 맞을 것이라고 생각합니다.
사무엘

좋은 기사입니다. 나는 당신이 더 많은 맥락을보고 편집자와 환경을 사용하여 물건을 확인할 수있는 패치를 사용하여 rebase하는 것을 좋아했습니다. 그것의 수치는 좋은 방법이없는 그 둘의 결합 좋은 부품
JonnyRaa

20

하나의 기본 파일에 대한 두 개의 변경 세트가 적용되는대로 하나의 기본 파일에 적용되는 대신 다른 하나의 결과와 병합되는 세 가지 방법으로 병합합니다.

예를 들어, 같은 위치에 선이 추가 된 두 개의 변경 사항이 있으면 한 줄의 변경이 아니라 두 개의 추가로 해석 될 수 있습니다.

예를 들어

파일 a는 두 사람, 하나는 무스 추가, 하나는 마우스 추가로 수정되었습니다.

#File a
    dog
    cat

#diff b, a
    dog
+++ mouse
    cat

#diff c, a
    dog
+++ moose
    cat

이제 적용 할 때 변경 세트를 병합하면 (3 방향 병합)

#diff b and c, a
    dog
+++ mouse
+++ moose
    cat

그러나 b를 적용하면 b에서 c 로의 변경을 살펴보면 'u'를 'o'로 바꾸는 것처럼 보입니다 (양방향 병합).

    #diff b, c
    dog
--- mouse
+++ moose
    cat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.