Programing

Mercurial에서 단일 개정판을 어떻게 선택합니까?

lottogame 2020. 11. 5. 07:41
반응형

Mercurial에서 단일 개정판을 어떻게 선택합니까?


Mercurial / TortoiseHg에서 다음 예제에서 D, E 및 F를 사용하지 않고 개정 "G"를 저장소 A에 병합하는 가장 쉬운 방법은 무엇입니까 (G가 D, E 또는 F에 의존하지 않는다고 가정).

Repo A: A - B - C

Repo B (Clone of A) A - B - C - D - E - F - G

패치가 최선의 방법입니까?


Tonfa가 맞습니다. 당신이 설명하는 것은 '병합'(또는 '밀기'또는 '당기기')이 아닙니다. 그것은 '체리 따기'입니다. 푸시 또는 풀은 한 리포지토리의 모든 변경 집합을 해당 리포지토리에 아직없는 다른 리포지토리로 이동합니다. '병합'은 두 개의 '헤드'를 가져 와서 두 가지의 조합 인 새로운 변경 집합으로 병합합니다.

실제로 G를 이동해야하지만 D, E, F를 유지할 수없는 경우 repo A에서 G를 'hg export'한 다음 repo A에서 'hg import'해야합니다. Transplant 확장 은 래퍼입니다. 여러 번에 걸쳐 동일한 변경 집합을 이동하는 것을 방지하는 데 도움이되는 몇 가지 좋은 기능을 사용하여 내보내기 / 가져 오기.

그러나 일반적으로 가져 오기 / 내보내기, 이식 및 체리 따기 사용의 단점은 조상없이 G 위로 이동할 수 없다는 것입니다. Mercurial에서 변경 집합의 이름 은 부모의 해시 드를 포함하는 'hashid' 이기 때문입니다. . 다른 부모 (G의 새 부모는 F가 아니라 C가 됨)는 다른 해시 드를 의미하므로 더 이상 G가 아닙니다. G의 작업이지만 이름에 의한 새로운 변경 집합입니다.

G를 새로운 것으로 옮겨 가면 G '(Gee prime)라고 부르겠습니다. 일부 용도에서는 큰 문제가 아니지만 다른 용도에서는 큰 피타입니다. 곧 repo B가 새 변경 세트를 가져 오면 H를 상위로 옮기고 싶을 때 다른 해시를 가진 G에서 G '로 변경됩니다. 즉, H는 H '로 이동합니다 .-- 100 개의 체인지 셋이 라인 아래로 내려 가고 repo A에서 D, E, F를 가질 수 없기 때문에 모든 것에 대해 다른 해시 드를 갖게됩니다.

Repo A에서 Repo B로 물건을 옮기고 싶을 때 (이전 이동의 반대 방향) 상황이 훨씬 더 나빠질 것입니다. A에서 B로 간단한 'hg push'를 시도하면 이미 Repo B에있는 변경 집합의 중복 인 G '(및 H'및 후속 하위 항목)를 얻을 수 있습니다.

그렇다면 당신의 선택은 무엇입니까?

  1. 상관 없어요. 데이터는 여전히 거기에 있습니다. 다른 이름을 가진 동일한 변경 집합으로 끝나고 두 저장소 간의 향후 교환에 대한 더 많은 작업이 수행됩니다. 그것은 틀린 것이 아닙니다. 아마도 약간 서투른 것이고 어떤 사람들은 상관하지 않습니다.
  2. D, E 및 F를 모두 Repo A 로 이동합니다. 무해한 경우 모든 변경 세트를 이동하고 모든 번거 로움을 피할 수 있습니다. 그다지 무해하지 않은 경우 이동 한 다음 'hg 백 아웃'을 수행하여 새 변경 세트 H에서 D, E 및 F의 효과를 취소 할 수 있습니다.
  3. 먼저 G에게 더 나은 혈통을주십시오. 이 경로를 가기에는 너무 늦었 기 때문에 ( 기록 편집 없이) 이것을 언급하는 것은 의미가 있습니다 . 당신이 해야 변경 집합 G 작업을 시작하기 전에 수행 한 것은에 있었다 hg update C. G가 변경 세트 D, E 및 F에 의존하지 않거나 필요하지 않으면 자녀가 아니어야합니다.

대신 C로 먼저 업데이트하면 다음과 같은 그래프가 표시됩니다.

A - B - C - D - E - F
          \
            G

그러면이 질문에 대한 전체 대답은 그냥 hg push -r G ../repoAG는 똑같은 hashid를 유지하면서 깨끗하게 움직일 것이고 D, E, F는 그것과 함께 가지 않을 것입니다.

최신 정보:

댓글에서 지적한대로. 현대 Mercurials의 hg graft명령은이를 수행하는 완벽한 방법입니다.


일반적으로 체리 피킹을 다루는 제목을 참조하여, 인터넷 검색 엔진이 일반적으로 체리 피킹을 위해 여기로 사람들을 데려 올 수 있으므로 하나의 저장소에서 작업하는 예를 제공합니다. 하나의 저장소에서 작업하면 hg graft다음 같이 수행됩니다 .

hg update C
hg graft G

결과는 다음과 같습니다.

            G'
          / 
A - B - C - D - E - F - G

추가 경고 : 두 개의 변경 세트는 동일한 파일에 대한 독립적 인 병렬 커밋으로 처리되며 병합 충돌이 발생할 수 있으므로 일반적으로 분기 관리를 위해 체리 선택을 피해야합니다. 예를 들어, 경우는 G안정 버전 지점에 적용되는 버그 수정 등의 북마크입니다 1.0.1, 당신이 대신해야 병합freeze 는 IT와 지점, 그리고 때때로 병합에 master분기 freeze지점의 버그 수정.

참고 URL : https://stackoverflow.com/questions/1670076/how-do-i-cherry-pick-a-single-revision-in-mercurial

반응형