Mercurial의 기능 지점을 올바르게 닫는 방법은 무엇입니까?
문제
기능 지점에서 작업을 마쳤습니다 feature-x
. 결과를 다시 합병하고 싶습니다 default
지점과 닫기 feature-x
출력에서 그것을 제거하기 위해 hg 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 이후 수은 이후 hg heads
더 이상.
머리를 하나 더 남기지 않고 합병 된 지점을 닫을 수 있습니까? 기능 분기를 닫는 더 정확한 방법이 있습니까?
관련 질문 :
해결책
한 가지 방법은 병합 된 기능 분기를 열어 두는 것입니다.
$ 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
, 그러나 어떤 커밋이 마지막으로 무엇인지 미리 알아야합니다.
업데이트: Mercurial 1.5이므로 언제든지 분기를 닫을 수 있으므로 둘 다에 나타나지 않습니다. hg branches
그리고 hg heads
더 이상. 당신을 괴롭힐 수있는 유일한 것은 기술적으로 개정 그래프가 여전히 Childen없이 한 가지 더 개정을 가질 것이라는 것입니다.
업데이트 2: Mercurial 1.8 이후 북마크 Mercurial의 핵심 특징이되었습니다. 북마크는 지명 된 분기보다 분기에 더 편리합니다. 이 질문도 참조하십시오.
다른 팁
IMHO 닫는 것을 잊어 버린 가지에 대한 두 가지 사례가 있습니다.
사례 1 : 분기가 기본적으로 병합되지 않았습니다
이 경우 나는 지점으로 업데이트하고 -Close-Branch로 다른 커밋을 수행합니다. 불행히도 이것은 지점이 새로운 팁이되도록 선택합니다. 따라서 다른 클론으로 밀기 전에 실제 팁이 더 많은 변화와 다른 사람들을 받도록합니다. 그 이상한 팁에 대해 혼란스러워하지 마십시오.
hg up myBranch
hg commit --close-branch
사례 2 : 분기가 기본적으로 병합되었습니다
이 사례는 사례 1과 크게 다르지 않으며 사례 1 및 2 개의 추가 단계에 대한 단계를 재현하여 해결할 수 있습니다.
이 경우 나는 분기 변경 세트로 업데이트하고 -Close-Branch로 다른 커밋을 수행하고 팁이 된 새로운 변경 사항을 기본값으로 병합합니다. 마지막 작업은 기본 브랜치 인 Hooray에있는 새 팁을 만듭니다!
hg up myBranch
hg commit --close-branch
hg up default
hg merge myBranch
이것이 미래의 독자들에게 도움이되기를 바랍니다.
편집하다 아야, 너무 늦었습니다 ... 나는 당신이 feature-x 변경 사항을 유지하고 싶다는 의견을 읽었으므로 여기서 복제 접근 방식이 작동하지 않습니다.
나는 여전히 다른 사람들에게 도움이 될 수 있기 때문에 여기에 답을 보내겠습니다.
예를 들어 "기능 x"를 완전히 제거하려면 예를 들어 작동하지 않기 때문에 복제 할 수 있습니다. 이것은 기사에 설명 된 방법 중 하나이며 작동하며 헤드에 대해 구체적으로 이야기합니다.
내가 이해하는 한 당신이 이것을 가지고 있고 "feaction-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
나는 당신이 원하는 것을 오해했을지 모르지만 제발 수정하지 마십시오. 나는 당신의 유스 케이스를 재현하는 데 시간이 걸렸습니다 :)
아직 아무도 기능 지점을 닫는 가장 강력한 방법을 제안한 것이 이상합니다. 결합시키다 -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에 여분의 머리가 없습니다. 추가 커밋이 없습니다.