2013-12-21 3 views
3

다른 DVCS에서 Mercurial로 변환하려고합니다. 나는 Mercurial이 다른 DVCS가 완벽하게 합리적인 것을 찾도록 내버려 두지 않는 상황을 발견했다. -> 포크 "병합 할 필요가 없습니다"와 hg 병합

  • 테스트

    • 포크
    • 포크
    • 병합 트렁크 작업을 수행합니다

      REPO에서 사용자 중 한 명이 같이 작업하는 습관을 것 같다

    • 병합 포크 -> 트렁크

    모두 완벽하게 reasonab 보인다 르. 단, 트렁크 이 사용자가 테스트하는 동안을 진행하지 않은 경우 hg는 'abort : no merge'라는 최종 병합을 거부합니다. --force 도움이되지 않습니다.

    나는 다음 테스트 케이스로이를 복제 할 수 있습니다 :

    echo "Test data" > file 
    hg add file 
    hg commit file -m "Ancestor" 
    # rev 0 
    
    echo "Trunk" > file 
    hg commit file -m "Trunk" 
    # rev 1 
    
    hg checkout 0 
    echo "Branch" > file 
    hg commit file -m "Branch" 
    # rev 2 
    
    hg merge --tool internal:local 1 
    hg commit -m "Merge trunk to branch" 
    # rev 3 
    
    hg checkout 1 
    hg merge --tool internal:local 3 # <--- fails 
    hg commit -m "Merge branch to trunk" 
    

    를 최종 병합 트렁크는 이제 새로운 버전 4와 버전 3에서 그래서 트렁크, 두 병합 사이에 전진 그래서 테스트를 수정하는 경우 그것으로 병합, 다 잘 작동합니다.

    이것은 분명히 모든 표준 워크 플로입니다. 저는 직접이 작업을 수행합니다. 그렇다면 왜 이것이 효과가 없습니까?

    업데이트 :

    이 테스트 케이스가 작동합니다

    echo "Test data" > file 
    hg add file 
    hg commit file -m "Ancestor" 
    hg branch trunk 
    # rev 0 
    
    echo "Trunk" > file 
    hg commit file -m "Trunk" 
    # rev 1 
    
    hg checkout 0 
    hg branch branch 
    echo "Branch" > file 
    
    hg commit file -m "Branch" 
    # rev 2 
    
    hg merge --tool internal:local 1 
    hg commit -m "Merge trunk to branch" 
    # rev 3 
    
    hg checkout 1 
    hg merge --tool internal:local 3 
    hg commit -m "Merge branch to trunk" 
    

    이 정확하게 첫 번째 테스트의 경우와 동일한 코드이다, 트렁크와 포크를 제외하고 지금은 명시 적으로 단지보다는 지형 ad-hoc 헤드 사용. 모든 병합 및 체크 아웃은 이전과 동일한 수정 버전을 사용합니다. 외관상으로는 분지는 마술이다.

    다른 DVCS 은 ad-hoc 헤드를 사용하는이므로 브랜치 정보가 없기 때문에 불행히도 실제 코드에서 브랜치를 사용할 수 없습니다. 나는 모든 포크에 대해 가지를 가짜로 만들고 싶지 않습니다.

    명시 적 분기를 사용하지 않고 Mercurial에서 어떻게하도록 할 수 있습니까?

  • 답변

    1

    수정본 3은 수정본 1의 직접적인 조상입니다. 여기에 병합 할 동시 변경 사항이 없습니다. 당신이해야 할 일은 hg update 3입니다.

    분기가 두 개인 경우 병합이 적용되며 새 공통 버전에서 양쪽면의 변경 사항을 수집하려고합니다. 이 경우에는 두 개의 분기 버전간에 세 가지 방법이 병합되어야합니다 (보다 큰 공통 조상의 정보를 사용)

    경우에 따라 두 개의 분기 된 버전이 있고 공통 조상이 없으며 파일의 이전 버전과 새 버전 만 있습니다. .당신은 단지 hg update 사용하려면이 다른 DVCS 어떤 병합을 포함하지 않는 무언가를 "병합"호출하여 혼란 이유를 모르겠어요

    (주변에 이동 update 공식 명령입니다, checkout는 별칭입니다) .

    :

    (다른 주 (주는 그래프의 그래픽 출력 hg log -G을 사용하는 것이 좋습니다).이 바보 같은 일을하는 오래된되지 않는 플래그입니다 --force 병합 사용하지 않을 그것은 좋은 이유 hg help merge에서 숨겨져)

    +0

    나는 동의하지 않는다. 나는 그것을 병합이라고 생각한다. 나는 그것을 증명할 수있다. 업데이트를 보라. 명시 적 분기에 각 포크를 배치함으로써 Mercurial은 DAG가 정확히 이전과 동일한 형태 임에도 불구하고 병합을 수행하게되어 매우 행복합니다. 불행히도 위에 설명한 이유 때문에 명시 적 분기를 사용할 수 없습니다 ... –

    +0

    분기 정보를 추가하면 여러 동작이 변경됩니다 (위에서 언급 한 업데이트의 동작 포함). 이 경우 병합은 새로운 분기 정보를 전달하는 새로운 커밋을 만듭니다. 처음에 설명하는 경우 새 커밋은 의미가 없습니다 (파일 변경, 메타 데이터 변경 등 없음) 정확히 여기서 무엇을하려고합니까? – Marmoute