Mercurial 이동이 새 지점으로 변경됩니다.


답변:


153

Mark가 제안한 것처럼 MqExtension 은 문제에 대한 하나의 솔루션입니다. IMHO 더 간단한 워크 플로는 rebase 확장 을 사용하는 것 입니다. 다음과 같은 역사가 있다고 가정합니다.

@  changeset:   2:81b92083cb1d
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   1:8bdc4508ac7b
|  summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

즉, 개정 0은 기능 작업을 시작한 기반입니다. 이제 1-2명명 된 브랜치에 대한 수정을 원합니다 my-feature. 개정판으로 업데이트하고 0해당 분기를 만듭니다.

$ hg up 0
$ hg branch my-feature
$ hg ci -m "start new branch my-feature"

이제 역사는 다음과 같습니다.

@  changeset:   3:b5939750b911
|  branch:      my-feature
|  tag:         tip
|  parent:      0:d554afd54164
|  summary:     start new branch my-feature
|
| o  changeset:   2:81b92083cb1d
| |  summary:     my new feature: edit file a
| |
| o  changeset:   1:8bdc4508ac7b
|/   summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

rebase명령을 사용하여 개정 1-2을 개정 으로 이동 하십시오 3.

$ hg rebase -s 1 -d 3

결과는 다음과 같습니다.

@  changeset:   3:88a90f9bbde7
|  branch:      my-feature
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   2:38f5adf2cf4b
|  branch:      my-feature
|  summary:     my new feature: add file b
|
o  changeset:   1:b5939750b911
|  branch:      my-feature
|  summary:     start new branch my-feature
|
o  changeset:   0:d554afd54164
   summary:     initial

그게 다야 .. Mark의 답변에 대한 주석에서 언급했듯이 이미 푸시 된 변경 집합을 이동하는 것은 일반적으로 통신하고 기록 조작을 시행 할 수있는 소규모 팀에서 일하지 않는 한 나쁜 생각입니다.


4
IMHO이 솔루션의 단점은 "start new branch my-feature"더미 커밋 (즉, 파일을 변경하지 않는 것)을 도입한다는 것입니다.
sschuberth

9
@sschuberth : 여기서 명시적인 것이 좋은 것이라고 생각합니다. 추가 변경 세트가 문제가되는 경우 다음 변경 세트와 결합하십시오 (예 : fold현재 내장 된 histedit 확장 의 명령 사용 ).
Oben Sonne

6
@AmirRachum : hg log -G( GraphlogExtension ). 수동으로 일부 줄을 제거했지만 사용자 지정 로그 스타일을 사용하여 완전히 자동으로 렌더링 될 수도 있습니다 .
Oben Sonne 2012


1
@sschuberth 동의합니다. 내 해결 방법은 --keepbranches 플래그를 사용하여 더미 커밋이 아닌 커밋을 더미 커밋의 부모로 리베이스 한 다음 더미 커밋을 hg 제거하는 것입니다. 이것은 지점 이름을 변경하는 데 많은 작업이지만 때때로 Mercurial은 그렇게 멍청합니다.
weberc2

30

MqExtension을 사용할 수 있습니다 . 이동할 변경 집합이 개정 1-3이라고 가정 해 보겠습니다.

hg qimport -r 1:3    # convert revisions to patches
hg qpop -a           # remove all them from history
hg branch new        # start a new branch
hg qpush -a          # push them all back into history
hg qfin -a           # finalize the patches

63:64와 66:68을 가져오고 싶습니다. 65 개정판이 64의 부모가 아닙니다
Casebash

65로 무엇을 하시겠습니까? Mq는 헤드에서 연속 된 변경 세트 만 변환 할 수 있습니다. 일반적으로 변경 불가능한 변경 세트를 편집 가능한 변경 가능한 패치로 변환합니다. 이렇게하면 해시가 변경되므로 (모든 하위에 영향을 미침) 건너 뛸 수 없습니다.
Mark Tolonen 2011 년

나는 주요 지점에 만들어 밀어 것으로 변경 (65 포함)의 숫자가
Casebash

1
푸시 된 변경 집합을 편집하지 마십시오. Mq는 해시를 변경하여 효과적으로 새로운 변경 세트가 될 것입니다. 푸시되지 않은 편집 내역 만.
Mark Tolonen 2011 년

이미 65를 밀었다면 63과 64를 움직이지 말고 66:68 (다시 밀지 않은 경우에만)에 만족해야합니다.
Matt

9

여기 에 Mark Tolonen이 설명하는 패치 솔루션을 선호합니다.

내가 가진 것 :

hg log -G

#default branch
@  changeset:   3:cb292fcdbde1
|
o  changeset:   2:e746dceba503
|
o  changeset:   1:2d50c7ab6b8f
|
o  changeset:   0:c22be856358b

내가 원하는 것 :

  @  changeset:   3:0e85ae268e35
  |  branch:      feature/my_feature
  |
  o  changeset:   2:1450cb9ec349
  |  branch:      feature/my_feature
  |
  o  changeset:   1:7b9836f25f28
  |  branch:      feature/my_feature
  |
 /
|
o  changeset:   0:c22be856358b

수은 명령 :

hg export -o feature.diff 1 2 3
hg update 0
hg branch feature/my_feature
hg import feature.diff

다음은 내 로컬 저장소의 상태입니다.

@  changeset:   6:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   5:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   4:7b9836f25f28
|  branch:      feature/my_feature
|
| o  changeset:   3:cb292fcdbde1
| |
| o  changeset:   2:e746dceba503
| |
| o  changeset:   1:2d50c7ab6b8f
|/
|
o  changeset:   0:c22be856358b

이제 기본 브랜치에서 수정 1 2 및 3을 삭제해야합니다. mq의 확장에서 strip 명령으로이를 수행 할 수 있습니다. hg strip저장소에서 변경 집합과 모든 하위 항목을 제거합니다.

구성 파일 (.hgrc 또는 Mercurial.ini)에 다음 줄을 추가하여 확장을 활성화합니다.

vim ~/.hgrc 다음을 추가하십시오.

[extensions]
mq =

이제 리비전 1에서이 저장소를 제거합니다.

hg strip 1

그리고 여기 우리는

@  changeset:   3:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   2:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   1:7b9836f25f28
|  branch:      feature/my_feature
|
o  changeset:   0:c22be856358b

참고 : 변경 세트는 다르지만 개정은 동일합니다.


5

GUI를 사용하려는 사람들을 위해

  1. Tortoise Hg-> File-> Settings로 이동 한 다음를 선택 rebase합니다.

여기에 이미지 설명 입력

  1. 거북이 UI 다시 시작

  2. 변경 사항을 이동할 새 분기를 만듭니다. 현재 지점 이름을 클릭-> 선택 Open a new named branch-> 지점 이름을 선택하십시오.

여기에 이미지 설명 입력

  1. 이동하려는 변경 사항이없는 경우 public(예 :) draft5로 이동합니다. (변경 사항이 이미 게시되어 있고 수석 개발자가 아닌 경우 큰 시간을 낭비 할 수 있으므로 수석 누군가에게 이야기해야합니다 (희생양 확보). , 나는 어떤 책임도지지 않습니다 :)).

View-> Show Console(또는 Ctrl+ L)로 이동 한 다음 콘솔에 씁니다. hg phase -f -d 2여기서 2는 가장 낮은 개정판이며 새 분기로 이동합니다.

  1. 브랜치 및 리비전으로 이동합니다 (3 단계에서 생성 된 새 브랜치로 변경 사항을 이동하는 경우 최상위 리비전이어야 함) Right Mouse->Update

  2. 변경 사항을 이동할 지점 및 revsion으로 이동 Right Mouse-> Modify History->Rebase

여기에 이미지 설명 입력

  1. Rebase갈등이 없도록 클릭 하고기도 하십시오 . 필요한 경우 병합하십시오.

  2. 변경 사항을 푸시합니다 draft. 이 시점에서 모든 개정은 여전히이어야 합니다.

  3. 변경 사항을 Right Mouse-> Change Phase to-> 으로 이동 한 분기의 최상위 개정으로 이동하십시오 Public.

여기에 이미지 설명 입력

이것이 시간을 절약하기를 바랍니다.


잘 했어! 하지만 한 가지 질문 만 해보겠습니다. 마지막에 단계를 공개로 변경하는 이유는 무엇입니까? "원격 저장소에서 볼 수있는 모든 변경 세트는 공개입니다."그래서 푸시 할 때 어쨌든 공개로 설정되지 않습니까?
Joshua Duxbury

@JoshLeeDucks 밀면 public더 이상 자동으로 변경되지 않습니다 (적어도 저에게는 그렇지 않습니다).
Matas Vaitkevicius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.