2012-07-23 6 views
6

나는 A, B, C, D와 같은 커밋을 가지고 있고 B, C, D를 유지하고 (BCD) ¹¹ 커밋을하고 싶다. 동시에 실행 취소하려는 커밋이 많은 경우이 작업을 수행하는 가장 쉬운 방법은 무엇입니까? 어떻게 Mercurial에서 여러 커밋을 되돌릴 수 있습니까?

는 (그때 나는 A와 hg update 및 일부 인수 hg commit를 호출 할 것을 제안이에 대한 유래 질문을보고 기억하는 것,하지만 지금 그 질문을 찾을 수 없습니다.)

답변

1

당신에게 ' 당신의 질문에 대답했습니다. 다시 A로 돌아가서 거기에서 계속하십시오. 이 시점에서 새로운 머리를 써야 할 경우 여기에 설명 된대로 일부 파일이나 다른 파일을 변경해야합니다 (How can I force mercurial to accept an empty commit). A mail thread은 MqExtension을 사용하여 BCD를 제거하는 방법을 설명합니다 (밀어 넣지 않은 경우).

+0

D가 HEAD 인 경우에만 표시됩니다. hg에는 가비지 컬렉션이 없으므로 B, C 및 D는 손실되지 않습니다. D는 단지 당신이 밀어 붙일 수있는 HEAD로 남을 것입니다. – DanMan

4

backout을 찾는 것처럼 들립니다.

hg help backout 

나는 그것을 한 번에 여러 개의 커밋을 백업 할 수 있습니다 생각하지 않는다, 그래서 당신은 개별적으로 철회해야 : 참고이 D의 상단에 세 개의 커밋을 생성합니다

hg backout D 
hg backout C 
hg backout B 

그 이러한 커밋을 하나의 변경 집합으로 결합하려는 경우 rebase --collapse 또는 다른 확장명 (예 : histedit 또는 mq 또는 collapse 개의 확장자) 중 하나를 사용하여이 커밋을 결합 할 수 있습니다.

hg update A 
hg debugsetparents D 
hg commit -m "revert B-D" 

그것은 추한,하지만 작동합니다

당신이 개별 변경을 백업하지만 한 번에 모든 것을하지 않으려면

는 다음을 수행 할 수 있습니다. 그러나 이것은 반대의 이름을 기록하지 않습니다. 솔직히 말하면,이 작업을 권장하지 않습니다. 개별 백 아웃 명령이 너무 많은 타이핑 문제로 인해 백 아웃이 정말로 필요한 것인지 궁금하게 만드는 경우가 있습니다. 케이스.

Jim과 Rafael이 제안한대로 B, C 및 D가 지점에 있고 A로 다시 업데이트하고 그 지점에서 기록을 분리하여 커밋을 계속할 수 있습니다. 이것은 더 적절할 수 있습니다.

+0

이것은 내가 원한대로 할 것이다. (3 개의 커밋을 mq로 함께 스쿼시하면된다.) 말하자면, 내가 원상태로 돌릴 커밋 (커밋)이 50 개라면 다루기 힘들어 질 것이다. http://stackoverflow.com/questions/1463340/revert-multiple-git-commits (하지만 hg의 경우)에서 승인 된 답변의 두 번째 부분에 더 가까운 것을 찾고 있는데, 즉 hg에 해당하는'git reset --hard A && git reset --soft @ {1} && git commit -a' –

+0

Mercurial에서 응답을 업데이트했습니다. 그러나 연결된 git 응답과 마찬가지로 실제로 변경 집합을 되돌릴 수는 없습니다. 정말 내가 왜 그런 커다란 변화 순서를 되 돌리는 지 궁금하게 생각합니다. 비활성 지점에 주차하는 것이 더 좋으며, 그 전에 변경 사항을 계속 수행하는 것이 좋습니다. 귀하의 유스 케이스에 대해 약간의 설명을 주시면 문제 해결에 도움이 될 것입니다. –

+0

또한, 단일 수정이 아닌 수정 세트를 승인하는 backout 명령을 위해 Mercurial에 기능 요청을 제출하는 것이 좋습니다. –

4

가장 쉬운 방법 :

당신은 변경 집합 D에 있고 당신이 그 지점 이제

hg commit --close-branch -m "Branch closed" 

를 종료하려면, 단지 새로운 물건 커밋을 변경 집합 및 작업을 계속 갈

hg up -r A 
... change stuff ... 
hg ci -m "New stuff" 

B, C 및 D가있는 분기가 있지만 종료되지만 hg heads에는 표시되지 않습니다. 그것은 비활성 지점이 될 것입니다.

너무 쉽게 표현할 수 있습니다. 그래프를 보면 별도의 지점이 닫히고 "공식"지점이 계속 표시됩니다. 당신의 지점에 소음을내는 되돌리기와 되감기 변경 세트를 갖는 것보다 훨씬 낫습니다.

+1

[다른 질문] (http://stackoverflow.com/questions/3688263/mercurial-beheading- a-head)에서 닫힌 헤드를 다른 저장소로 푸시하려고하면 여러 헤드를 만드는 것에 대한 경고를 받게됩니다. 그러므로 처음으로 밀어 넣을 때'hg push --force'를 사용하십시오. 닫힌 머리를 당기는 사람들은 어떤 경고도받지 못할 것입니다. – mernst

관련 문제