[version-control] 3 방향 병합이 2 방향 병합보다 유리한 이유는 무엇입니까?

Wikipedia에 따르면 3 방향 병합은 2 방향 병합보다 오류 발생이 적으며 종종 사용자 개입이 필요하지 않습니다. 왜 이런 경우입니까?

3 방향 병합이 성공하고 2 방향 병합이 실패하는 예가 도움이됩니다.



답변

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

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

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


답변

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

슬라이드 이미지

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

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

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

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


답변

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


답변

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

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

예를 들어

파일 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


답변