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'및 후속 하위 항목)를 얻을 수 있습니다.
그렇다면 당신의 선택은 무엇입니까?
- 상관 없어요. 데이터는 여전히 거기에 있습니다. 다른 이름을 가진 동일한 변경 집합으로 끝나고 두 저장소 간의 향후 교환에 대한 더 많은 작업이 수행됩니다. 그것은 틀린 것이 아닙니다. 아마도 약간 서투른 것이고 어떤 사람들은 상관하지 않습니다.
- D, E 및 F를 모두 Repo A 로 이동합니다. 무해한 경우 모든 변경 세트를 이동하고 모든 번거 로움을 피할 수 있습니다. 그다지 무해하지 않은 경우 이동 한 다음 'hg 백 아웃'을 수행하여 새 변경 세트 H에서 D, E 및 F의 효과를 취소 할 수 있습니다.
- 먼저 G에게 더 나은 혈통을주십시오. 이 경로를 가기에는 너무 늦었 기 때문에 ( 기록 편집 없이) 이것을 언급하는 것은 의미가 있습니다 . 당신이 해야 변경 집합 G 작업을 시작하기 전에 수행 한 것은에 있었다
hg update C
. G가 변경 세트 D, E 및 F에 의존하지 않거나 필요하지 않으면 자녀가 아니어야합니다.
대신 C로 먼저 업데이트하면 다음과 같은 그래프가 표시됩니다.
A - B - C - D - E - F
\
G
그러면이 질문에 대한 전체 대답은 그냥 hg push -r G ../repoA
G는 똑같은 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
'Programing' 카테고리의 다른 글
Linux 또는 Windows에서 OS X 용으로 컴파일하는 방법은 무엇입니까? (0) | 2020.11.05 |
---|---|
원형 잠금없는 버퍼 (0) | 2020.11.05 |
git push를 할 때“diff.renamelimit 변수”에 대한 경고 (0) | 2020.11.05 |
Struts 태그에서 #, % 및 $ 기호의 차이점은 무엇입니까? (0) | 2020.11.05 |
h : button과 h : commandButton의 차이점 (0) | 2020.11.05 |