Mercurial에서 기능 분기를 올바르게 닫는 방법은 무엇입니까?


240

기능 분기 작업을 마쳤습니다 feature-x. 의 출력에서 ​​결과를 제거하기 위해 결과를 default분기로 다시 병합 하고 닫고 싶습니다 .feature-xhg branches

다음 시나리오를 생각해 냈지만 몇 가지 문제가 있습니다.

$ hg up default
$ hg merge feature-x
$ hg ci -m merge
$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch

너무 feature-x지점 (changests 40- 41) 폐쇄,하지만이되어 하나의 새로운 머리 , 닫는 지점 변경 집합 44에 표시됩니다 hg heads때마다 :

$ hg log ...
o  44 Closed branch feature-x
|
| @  43 merge
|/|
| o  42 Changeset C
| |
o |  41 Changeset 2
| |
o |  40 Changeset 1
|/
o  39 Changeset B
|
o  38 Changeset A
|

업데이트 : 버전 1.5 Mercurial은 hg heads더 이상 닫힌 분기의 헤드를 더 이상 표시하지 않습니다 .

더 이상 머리를 남기지 않고 병합 된 분기를 닫을 수 있습니까? 기능 분기를 닫는 더 올바른 방법이 있습니까?

관련 질문 :


@Andrey : 그러나 지적 된 기사는 "--close-branch"에 대해서만 말하는 것이 아닙니다. 분기를 정리하는 가지 방법을 보여줍니다 . 더 이상 원하지 않으면 기사에 설명 된대로 복제 할 수 있습니다. 유일하게 '문제'는 어떤 이유로 든 닫고 싶지만 주변에 두는 것입니다.
SyntaxT3rr0r

1
@WizardOfOdds 예, 죽은 가지 가지 치기에 대한 전체 기사를 읽었습니다. 브랜치가 개정 내역을 유지하고 버리지 않기를 원합니다. 이전에는 피처 브랜치를 default"닫지 않고" 병합 했습니다. 새 헤드는 0 개가되었지만 그러한 분기는 hg branches영구적 으로 볼 수있었습니다 (비활성 분기로).
Andrey Vlasovskikh

기능을 개발하기 위해 전체 저장소를 복제 한 다음 기능이 완료되면 다시 병합하는 경향이 있습니다. 나는 역사에 (폐쇄 된) 지점의 유적을 갖고 싶지 않습니다.
DanMan

답변:


218

한 가지 방법은 병합 된 기능 분기를 열린 상태로 유지하고 비활성화하는 것입니다.

$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
feature-x  41:...
    (2 branches)

$ hg branches -a
default    43:...
    (1 branch)

다른 방법은 추가 커밋을 사용하여 병합하기 전에 기능 분기를 닫는 것입니다.

$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch
$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
    (1 branch)

첫 번째는 더 간단하지만 열린 지점을 떠납니다. 두 번째는 열린 헤드 / 브랜치를 남기지 않지만 하나 이상의 보조 커밋이 필요합니다. 피처 브랜치에 대한 마지막 실제 커밋과을 사용하는이 추가 커밋을 결합 할 수 --close-branch있지만 어떤 커밋이 마지막 커밋인지 미리 알고 있어야합니다.

업데이트 : 그것은 모두에 표시되지 않도록 언제든지 분기를 닫을 수 있습니다 의욕 1.5 이후 hg brancheshg heads이상. 성가 시게 할 수있는 유일한 것은 기술적으로 개정 그래프가 여전히 자녀없이 개정을 한 번 더한다는 것입니다.

업데이트 2 : Mercurial 1.8 북마크 는 Mercurial 의 핵심 기능이되었습니다. 북마크는 명명 된 브랜치보다 브랜칭하기에 더 편리합니다. 이 질문도 참조하십시오 :


2
반드시 그런 것은 아닙니다 Bookmarks are more convenient for branching than named branches. Hg 북마크는 Git 브랜치와 다릅니다. 그것들은 피쳐 브랜치로 부적합하게 만드는 많은 경우로 가득합니다. 예를 들어, 리포지토리를 복제하면 default브랜치 에서 최신 커밋으로 끝납니다 . 책갈피를 사용하는 경우이 변경 세트는 임의 (불안정한) 책갈피에 해당합니다. 명명 된 분기를 사용하는 경우 안정 / 기본 분기에서 최신 커밋을 얻습니다. 북마크가 언젠가는 도착하지만 아직 없습니다.
Gili

북마크를 로컬 리포지토리에서만 볼 수있는 개인 태그로 사용합니다. 다시 방문해야하는 변경 세트를 상기시키는 역할을합니다.
Gili

이 접근법을 따르려고했지만 푸시하려고 할 때 여전히 오류가 발생 abort: push creates new remote branches:합니다. 내가 뭘 잘못했을 수 있니?
kasperd

79

imho 닫는 것을 잊어 버린 가지에 대한 두 가지 경우가 있습니다

사례 1 : 지점이 기본값으로 병합되지 않았습니다

이 경우 지점으로 업데이트하고 --close-branch로 다른 커밋을 수행합니다. 불행히도 이것은 지점을 새로운 팁으로 선택하므로 다른 클론으로 푸시하기 전에 실제 팁에 더 많은 변경 사항 및 기타 사항이 적용되도록합니다. 그 이상한 팁에 대해 혼동하지 마십시오.

hg up myBranch
hg commit --close-branch

사례 2 : 지점이 기본값으로 병합되었습니다

이 경우는 사례 1과 크게 다르지 않으며 사례 1과 두 개의 추가 단계를 재현하여 해결할 수 있습니다.

이 경우 분기 변경 세트로 업데이트하고 --close-branch로 다시 커밋하고 팁이 된 새 변경 세트를 기본값으로 병합합니다. 마지막 작업은 기본 브랜치 인 HOORAY!에 새로운 팁을 만듭니다.

hg up myBranch
hg commit --close-branch
hg up default
hg merge myBranch

이것이 미래 독자들에게 도움이되기를 바랍니다.


3
나와 같은 Mercurial 초보자를위한 명확한 답변입니다. 그리고 hg help의 명령 중 하나로 나열되지 않은 "ci"를 사용하지 않아서 감사합니다
.

8
@MB .: 그런 경우 hg help ci설명해 드리겠습니다.
Chris Morgan

'hg merge'명령이 말해
주듯이

11

늦게 편집 편집 ... feature-x 체인지 셋을 유지하고 싶다고하는 의견을 읽었으므로 복제 방법이 작동하지 않습니다.

다른 사람들에게 도움이 될 수 있으므로 여기에 대한 답변을 계속하겠습니다.

"feature X"를 완전히 제거하려면 예를 들어 작동하지 않기 때문에 복제 할 수 있습니다. 이것은 기사에서 설명 된 방법 중 하나이며 작동하며 머리에 대해 구체적으로 이야기합니다.

내가 아는 한, 당신은 이것을 가지고 "feature-x"헤드를 한 번에 제거하고 싶습니다 :

@    changeset:   7:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| | o  changeset:   5:013a3e954cfd
| |/   summary:     Closed branch feature-x
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

그래서 당신은 이것을합니다 :

hg clone . ../cleanedrepo --rev 7

그리고 당신은 다음을 가질 것이고, 당신은 feature-x가 실제로 사라진 것을 볼 수 있습니다 :

@    changeset:   5:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

나는 당신이 원하는 것을 잘못 이해했을 수도 있지만 수정하지 마십시오. 사용 사례를 재현하는 데 시간이 걸렸습니다 :)


7

아직 아무도 기능 분기를 닫는 가장 강력한 방법을 제안하지 않은 것은 이상합니다. 병합 커밋을 --close-branch 플래그와 결합 할 수 있습니다 (예 : 수정 된 파일을 커밋하고 동시에 분기를 닫음).

hg up feature-x
hg merge default
hg ci -m "Merge feature-x and close branch" --close-branch
hg branch default -f

이것이 전부입니다. revgraph에 여분의 머리가 없습니다. 추가 커밋이 없습니다.


"" "-close-branch를 사용하여 기능 분기에 대한 마지막 실제 커밋을이 추가 커밋과 결합 할 수 있지만 어떤 커밋이 마지막 커밋인지 미리 알고 있어야합니다." " "
Andrey Vlasovskikh

알 겠어. 나는 문장의 마지막 부분을 이해하지 못하기 때문에 ( "하나는 알아야합니다 ..."), 다른 의미가 있다고 생각했습니다. 또한이 방법은 대부분의 GUI 도구 (TortoiseHG, SourceTree 등)에서 지원되지 않습니다.
tav

@AndreyVlasovskikh이 답변의 핵심은 기능 분기의 마지막 커밋이 아닌 병합에서 분기를 닫는 것입니다.
kasperd

@tav merge명령을 실행하기 전에 hg branch병합의 분기 이름이 열려고하는 분기 이름인지 확인하는 데 사용하는 것이 좋습니다 .
kasperd

2
자세히 살펴보면 병합은 항상 닫힌 분기에 나타납니다. 원하는 결과는 부모 중 하나의 지점에 있고 다른 부모의 지점을 닫는 것입니다. 가능하지 않은 것 같습니다. 따라서 이것은 실제로 실행 가능한 솔루션처럼 보이지 않습니다. 너무 나쁜 점은 병합을 지점의 종점으로 사용하고 싶었습니다.
kasperd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.