2012-03-07 2 views
97

최근에 Mercurial에서 릴리스 분기를 유지할 때 변경 사항을 건너 뛰는 것에 관한 몇 가지 질문이있었습니다. 예를 들어 :Mercurial에서 그래프트 사용의 결과

는, 나는이 문제를 방지하려면 graft 사용에 대한 궁금했습니다. 다음과 같이 개정 나무를 감안할 때 :

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

가정 해 우리가 악 변화 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을 : 여기 무슨 일이? transplantF::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 사용하여 단지 보통의 3 방향 병합인가?
  • Q3 : 수은은 병합에 도움이되는 접목 수술에 대한 추가 정보를 저장/사용 했습니까?

그리고 마지막으로 ...

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

답변

118

D 및 이식 자 F::J으로 업데이트하면 Mercurial은 여러 병합을 실행합니다.우리는 국가 CD 사이의 델타를위한 +d을 작성하는 경우

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

는, 우리는 시작 : 그것은이 병합과 함께 시작됩니다 시계 방향으로 90도 그래프를 돌려

 +d  +e  +f 
---- C ---- D ---- E ---- F ---- 
및 위의 세 가지 웨이 병합은 다음과 같습니다

입니다
-e 
    .---- D 
/
E 
\ 
    '---- F 
    +f 

, 우리는 우리가 E 시작하고 일을 적용 척 반대로 -e의 경우 D이됩니다. 나는 +e의 역 패치로 생각합니다. E에서 시작하여 우리는 또한 정상적인 델타 +f와 함께 상태 F에갔습니다. 여기서 이상한 점은 없습니다. 우리는 이미 모든 상태 (D, EF)를 저장소에 가지고 있습니다. 이렇게 보니 DF을 병합 할 수 있습니다.

병합은 "다이아몬드 완성"문제입니다. 그래서 우리는 DF 어디 M-D에서 차이가 +f 유사하며 M-F에서 차이가 -e과 유사의 혼합 인 새로운 상태 M을 찾을 수 있습니다. 그것은 다음과 같습니다

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

+f 델타 +f'를되었고, -e 델타 -e'되었다. 이것은 단지 일반적인 3 방향 병합이지만, 효과는 재미 있습니다 : E 대신 DF을 적용했습니다! 병합 후

F- M의 두 번째 부모는 삭제 :

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

가 반복하려면 우리는 DF의 "효과"를 복사 한, 즉, 우리가 델타를 발견했다 (+f')는 +fE에 적용했을 때와 동일한 효과를 나타낸다. 우리가 얻을 수있는 그래프를 조금 정돈 할 수 있습니다

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

결과는 F 전체 삼원 기계를 사용하여 D에 이식되어 있다는 점이다.

  • Q1 : 여기 무슨 일이? 그래서 ....... 어떻게 작동합니까? 왜 더 나은가요?

    A1 : 병합 기계는 병합 기계가 이름 변경과 같은 작업을 수행하기 때문에 패치보다 효과적입니다.

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

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

  • Q3 : 머큐리얼은 머지 작업에 도움이되는 그래프트 조작에 대한 추가 정보를 저장/사용 했습니까?

    A3 : 번호

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

    A4 : 병합 관점에서는 괜찮습니다. 그것은 사람들에게 혼란을 줄 수있는 역사를 복제 할 것입니다.

+4

위대한 질문, 훌륭한 답변 :). 둘 다 +1! –

+0

Martin 감사합니다. 그건 누구도 그걸 생각해내는 꽤 펑키 한 생각입니다. 나는 아이디어를 얻었지만 일반적인 경우를 해결할 필요가있다. 나는 당신이 접목하는 노드들 사이의 경로와 상관없이 그것을 보유하고 있다고 생각하고 있습니까? –

+3

@ Paul : 당신이 알아야 할 것은 이식편이 이식 수술보다 더 강력한 방법으로 변경 집합을 복사 할 수 있다는 것입니다. 이름 변경이 처리되고 병합 도구에서 충돌을 해결할 수 있다는 점에서 견고합니다. 이상한 병합에 관한 세부 사항은 있지만, 이식편의 일상적인 사용을 이해하는 데 필수적이지는 않습니다. :-) –

6

1 : 충돌이있을 때 도움이됩니다. 평소의 병합 도구를 사용할 수 있습니다 (필자가 Emacs의 smerge-mode로 편집 한 인라인 충돌 마커입니다).

질문 2 : 정상적인 병합입니다.

Q3 : 제

Q4 : 나는이 두 개의 거의 동일한 지점을 가지고 추한 생각합니다.