모든 로컬 변경 집합을 삭제하고 트리로 되돌리기


95

나는 Mercurial을 사용하고 있으며, 세 개의 머리로 인해 지역적으로 끔찍한 혼란에 빠졌습니다. 푸시 할 수 없으며 모든 로컬 변경 사항과 커밋을 삭제하고 완전히 깨끗한 코드와 깨끗한 기록으로 다시 시작하고 싶습니다.

즉, (a) 원격 브랜치의 팁에 존재하는 것과 정확히 동일한 코드를 로컬로 사용하고 (b) 로컬 커밋의 기록이없는 것으로 끝나고 싶습니다.

내가 알고 hg update -C로컬 변경 사항을 덮어 씁니다. 하지만 로컬 커밋을 어떻게 삭제합니까?

분명히 말하면, 나는 내가 지역에서 한 일을 보존하는 데 관심이 없습니다. 나는 완전히 깨끗한 로컬 체크 아웃으로 되 돌리는 가장 간단한 방법을 원합니다.


답변:


129

가장 간단한 방법 (new hg clone)이 실용적이지 않을 때 다음을 사용합니다 hg strip.

% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

hg outgoing조용 해질 때까지 반복합니다 . hg strip $rev삭제 $rev및 모든 하위 항목에 유의하십시오 .

먼저 stripMercurial 설정에서 활성화 해야 할 수도 있습니다 .

추신 : 더 현명한 접근 방식은 revset 언어를 사용하는 것입니다.

% hg strip 'roots(outgoing())'

1
감사합니다! 나는 이것이 전혀 소란스럽지 않고 완벽하게 해결되는 상황에 이르렀습니다.
eswald 2011 년

1
이것은 위의 대규모 수정에서 저를 구했습니다. 매우 간단합니다. 감사합니다!
David C

3
누구라도 hg strip 'roots(outgoing())'인식하지 못해 출근에 문제가있는 경우 'roots(outgoing())'. 나는 그것을 hg strip "roots(outgoing())".
jsea

@SombreErmine in cmd.exe, 예.
그냥 누군가

21

원격 저장소에도있는 변경 세트 만 보존하는 로컬 복제본을 만들고 싶을 것입니다. 사용 TortoiseHg , hg log또는 그림과 유사한은 개정의 어떤에서 당신이 최신 버전입니다 하지 않았다 만들기 (시작 엉망 전에 하나). 를 사용하면 hg outgoing여기에서 도움이 될 수 있습니다. 모든 변경 세트가 나열됩니다. 이전 버전보다 먼저 수정 번호를 선택하십시오.

대상 개정이 호출 good되고 복제본이 foo이면 다음을 수행하십시오.

hg clone -r good foo foo-clean

이것은 빠른 로컬 작업이 될 것 입니다. 모든 것을 다시 다운로드 할 이유없습니다 . foo-clean복제는 개정까지 변경 집합이 포함됩니다 good. 이제 대체 할 수 foo-clean/.hg/hgrcfoo/.hg/hgrc같은 기본 푸시 / 풀 경로로 저장소 로컬 설정을 유지하기 위해.

당신이 만족하는 경우 foo-clean당신이에서 필요로하는 모든 것을 갖추고 foo, 단순히 삭제 foo및 이름 변경 foo-cleanfoo. a는 마십시오 hg pull당신의 클론으로 원격 저장소에서 새로운 변경 집합을 얻을 정상처럼 계속합니다.


아무도 새 변경 세트를 원격 저장소에 푸시하지 않은 경우 good위와 같이 사용할 개정판을 결정하는 것은 매우 간단 hg id default합니다. 원격 저장소에있는 팁의 ID를 알려줍니다.


나는 같은 상황을 겪고 있지만 repo 디렉토리에 많은 파일이 있지만 hgignore에 있습니다. hg 스트립을 설치할 수 없으며 전체 복제본을 교체하지 않고 로컬 커밋을 삭제하고 싶습니다. 어떤 아이디어? -아! 파일을 추가하지 않은 경우 다른 복제본을 이전 디렉토리에 복사 할 수 있어야합니다!?
Peteter

하지만 여러 분기가있는 경우이 방법에주의하십시오. 지정된 개정으로 복제하면 지정된 개정의 분기에 대한 변경 집합 만 가져옵니다. 그런 다음 hg pull -r각 추가 분기의 마지막 "정상"개정 을 수행해야 할 수 있습니다 .
Yitz 2013 년

9

확인. 따라서 모든 로컬 항목, hg init새 로컬 저장소 및 hg pull최신 팁을 삭제하십시오 . hg update이 후에 잊지 마세요 .


감사. '모든 로컬 항목 삭제'라고 말하면 전체 저장소를 삭제하거나 내 변경 사항 만 삭제한다는 의미입니까? hg init은 무엇을하나요 (Google에 검색했지만 간단한 설명을 볼 수 없음), 플래그를 함께 사용해야합니까? Mercurial .hgrc 기본 설정과 같은 항목이 삭제됩니까?
Richard

업데이트 : 프로젝트 루트 디렉토리의 모든 것을 삭제하고 'hg init'를 입력하면 'abort : repository'가 나타납니다. 이미 존재 함!'. 새 디렉토리에서 설정하고 작업해야합니까? 나는 가능하다면하지 않겠다 ... 분명히 내가 로컬에서 한 모든 것을 죽일 수있는 간단한 방법이 있어야한다?!
Richard

예, 모든 저장소 항목을 포함한 모든 항목을 삭제하십시오. 새 깨끗한 폴더에서 시작하십시오. 기본 설정을 백업 파일에 저장 한 다음 hg init reponame으로 만든 새 저장소로 복원 할 수 있습니다. init 및 stuff에 대한 세부 정보 : hgbook.red-bean.com/read/mercurial-in-daily-use.html
alemjerus

6
alemjerus : hg init+ hg pull= hg clone차이점은 사용자 hg clone에게 좋은 .hg/hgrc파일을 만들고 hg clone동일한 파일 시스템에서 복제 할 때 공간을 절약하기 위해 하드 링크를 사용 한다는 것입니다.
Martin Geisler

Richard : 결과 hg help init는 다음과 같습니다. selenic.com/mercurial/hg.1.html#init 하지만 너무 간결한 것일까 요? 도움이 더 필요하시면 메일 링리스트로 메일을 보내주세요! 참조 : mercurial.selenic.com/wiki/MailingLists
Martin Geisler

5

당신은 사용할 수 있습니다

hg 스트립 개정

로컬 리포지토리의 모든 개정판과 하위 트리를 종료합니다.

https://www.mercurial-scm.org/wiki/Strip

그러나 이미 푸시 된 것에 사용하려고하지 마십시오.


공개 개정판에서 사용할 수 있지만 다시 당기면 다시 나타납니다. (HG 스트립는 로컬 저장소와 함께 작동합니다.)
마이크 Rosoft

2

로컬 시스템에있는 모든 것을 삭제하고 원격 저장소를 다시 복제하십시오.


2
hg strip`hg out --template "{rev} {author} \ n"| grep YOUR_AUTHOR_NAME | 잘라 내기 -d ""-f 1`

나를 위해 트릭을 수행합니다.

작성자 이름으로 생성 된 기본 저장소로 푸시되지 않은 모든 개정을 제거합니다.

이 스타일을 사용하여 기본 저장소가 아닌 다른 저장소를 확인하도록 할 수도 있습니다.

hg strip`hg out OTHER_REPO_ALIAS-템플릿 "{rev} {author} \ n"| grep YOUR_AUTHOR_NAME | 잘라 내기 -d ""-f 1`

0

TortoiseHg를 사용하는 경우 (작은) 혼란에서 벗어나는 간단한 방법 중 하나는 먼저 최신 개정판으로 업데이트 한 다음 변경 집합을 선택하고 "로컬과 병합"을 시작하는 것입니다. 병합 대화 상자가 나타나면 작은 '+'아이콘을 클릭하여 몇 가지 추가 옵션을 표시합니다. 그 중 하나는 "병합 대상 (기타) 개정판에서 변경 집합 삭제"입니다. 이렇게하면 변경 세트가 여전히 리포지토리에 있고 푸시되지만 병합시 삭제되므로 아무 효과가 없습니다. 많은 헤드에 걸쳐있는 많은 변경 집합이있는 경우 이러한 방식으로 리포지토리를 오염시키고 싶지 않을 수 있지만 이는 간단한 수정이며 나중에 참조 할 수있는 데이터가 삭제하려는 변경 집합에 포함되어 있는지 고려할 가치가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.