Mercurial에서 이식편 사용의 결과


98

최근 Mercurial에서 릴리스 브랜치를 유지할 때 변경 사항을 건너 뛰는 것에 대해 몇 가지 질문이있었습니다. 예를 들면 :

2.0에서 도입 된 이후 graft로이 문제를 피하기 위해 사용하는 것이 궁금했습니다 . 다음과 같은 수정 트리가 주어집니다.

A---B---C---D---E---F---G---H---I---J

Evil 변경을 건너 뛰는 릴리스 브랜치를 만들어야한다고 가정합니다 E.

hg update -r D
hg graft "F::J"

우리에게 :

A---B---C---D---E---F---G---H---I---J
             \
              --F'--G'--H'--I'--J'
  • Q1 : 여기서 무슨 일이 일어 났습니까? 에서 transplant패치를 생성 F::J한 다음에 적용 했을 것임을 이해할 수 D있지만 graft패치보다는 3 방향 병합을 사용한다고합니다. 그래서 ....... 어떻게 작동합니까? 왜 더 낫습니까?

이제 수정 E하고 릴리스 브랜치에 병합 한다고 가정하겠습니다 .

                  --E2-----------------
                 /                     \
A---B---C---D---E---F---G---H---I---J---M1
             \                            \
              --F'--G'--H'--I'--J'---------M2--

M1은 직선 병합입니다. 특별한 것은 없습니다. M2는 "동일한"(또는 적어도 동등한) 변경 사항이있는 분기를 병합합니다.

  • Q2 :이 병합은 D, J'M1 ?
  • Q3 : 수은은 합병을 돕기 위해 이식 수술에 대한 추가 정보를 저장 / 사용 했습니까?

그리고 마지막으로...

  • Q4 : 이와 같은 흐름의 잠재적 인 문제는 무엇입니까?

답변:


119

로 업데이트 D하고 접목 할 때 F::JMercurial은 여러 병합을 실행합니다. 이 병합으로 시작됩니다.

M = three_way_merge(local=D, other=F, base=E)

우리가 작성하는 경우 +d상태 사이의 델타 CD, 우리는 시작 :

        +d     +e     +f
---- C ---- D ---- E ---- F ----

그래프를 시계 방향으로 90도 돌리면 위의 3 방향 병합은 다음과 같습니다.

    -e  
  .---- D
 /
E
 \
  '---- F
    +f

즉,로 시작하여 E의 반대를 적용한 척 -e하여 D. 나는의 역 패치라고 생각한다 +e. 시작해서 E우리는 또한 F일반 델타 상태 로 갔습니다 +f. 여기에 이상한 아무것도 - 우리가 모든 상태를 (이 D, E그리고 F이미 저장소에). 이렇게 보면 병합 할 수 D있고F .

병합은 "다이아몬드 완성"의 문제입니다. 우리는 새로운 상태 찾을 수 있도록 M의 혼합이다 D그리고 F어디에서의 차이 D로는 M유사하다 +f와의 차이 F에 대한이 M와 유사한입니다 -e. 다음과 같이 보입니다.

    -e     +f'
  .---- D ----.
 /             \
E               M
 \             /
  '---- F ----'
    +f     -e'

+f델타되었다 +f'-e델타되었다 -e'. 이건 그냥 보통의 세 방향 병합이지만, 효과는 재미있다 : 우리가 적용한 FD대신E !

병합 후 Mto 의 두 번째 상위 항목 F이 삭제됩니다.

    -e     +f'
  .---- D ----.
 /             \
E               M
 \
  '---- F
    +f

다시 말하지만, 우리는 "효과"를 복사했습니다. FD . 즉, 에 적용될 때와 동일한 효과 +f'D주기 위해 적용된 델타 ( )를 찾았 +f습니다 E. 그래프를 약간 똑 바르게하여 다음을 얻을 수 있습니다.

       +f'
--- D ---- M
     \
      '---- E ---- F
        +e     +f

그 결과 완전한 3 방향 기계 FD사용하여 접목되었습니다 .

  • Q1 : 여기서 무슨 일이 일어 났습니까? 그래서 ....... 어떻게 작동합니까? 왜 더 낫습니까?

    A1 : 병합 기계는 이름 바꾸기와 같은 것들을 고려하기 때문에 병합을 사용하는 것이 패치보다 낫습니다.

  • Q2 : 이 병합은 D, J '및 M1을 사용한 일반적인 3 방향 병합입니까?

    A2 : 예, 접목은 그래프의 토폴로지를 변경하지 않습니다.

  • Q3 : 수은은 합병을 돕기 위해 이식 수술에 대한 추가 정보를 저장 / 사용 했습니까?

    A3 : 아니요.

  • Q4 : 이와 같은 흐름의 잠재적 인 문제는 무엇입니까?

    A4 : 병합 관점에서는 제대로 작동합니다. 사람들에게 혼란 스러울 수있는 일부 역사를 복제합니다.


4
좋은 질문, 좋은 대답 :). 둘 다 +1!
Laurens Holst 2012 년

고마워요 마틴. 누구든지 그것을 생각 해낸 사람의 꽤 펑키 한 생각입니다. 아이디어는 있지만 일반적인 경우를 해결해야합니다. 나는 그것이 당신이 접목하는 노드 사이의 경로에 관계없이 유지한다고 생각합니까?
Paul S

3
@PaulS : 당신이 알아야 할 것은 이식이 이식보다 더 강력한 방식으로 변화 집합을 복사 할 수 있다는 것입니다. 이름 변경이 처리되고 병합 도구에서 충돌을 해결할 수 있다는 점에서 강력합니다. 세부 사항은 이상한 병합에 있지만 일상적인 이식편 사용을 이해하는 데 필수적인 것은 아닙니다! :-)
Martin Geisler 2012 년

3
아니요,하지만 저는 필요하지 않은 것들을 이해하려고 애쓰는 멍청이입니다 ;-) 어쨌든 당신의 것을 기본으로 사용하는 좀 더 일반적인 예를 통해 작업했습니다.
Paul S

@PaulS 그렇다면 이것을 언급하는 것이 거의 두렵습니다.하지만 Darcs 와 패치 이론을 찾아 볼 수 있습니다 . 그래프를 90도 회전하는 것에 대한 위의 트릭은 병합 할 때 패치를 통근하는 방법에 대해 많은 것을 상기시켜줍니다. 예쁜 털이 물건 :-)
마틴 가이슬러

6

Q1 : 갈등이있을 때 도움이됩니다. 그런 다음 일반적인 병합 도구를 사용할 수 있습니다 (저는 Emacs의 smerge-mode로 편집하는 인라인 충돌 마커입니다).

Q2 : 정상적인 병합입니다.

Q3 : 아니요.

Q4 : 거의 동일한 두 개의 브랜치를 갖는 것은 추악하다고 생각합니다.

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