[mercurial] Mercurial에서 로컬 커밋을 삭제하는 방법이 있습니까?

그래서 나는 Mercurial에서 바보 같은 실수를 계속합니다. 종종 “hg pull”과 “hg update”를하지 않고 작업을 시작합니다. 변경 사항을 적용하려고하면 오류가 발생합니다.

로컬 커밋 을 삭제 하여 여러 헤드, 분기 등을 생성하지 않도록 할 수 있는 방법이 있습니까? 로컬 커밋을 삭제하고 변경 사항을 팁과 병합 한 다음 다시 커밋하려고합니다. 간단하게 들리나요? 로컬 커밋 을 쉽게 삭제하는 방법을 찾지 못해 팁과 깔끔하게 병합 할 수 있습니다.

다시 한 번, “hg ci”로 만든 로컬 커밋 만 삭제하려고합니다. 파일 수정, 되돌리기 등을 원하지 않습니다.



답변

strip “확장자를 활성화하고 다음을 입력하십시오.

hg strip #changeset# --keep

#changeset#제거하려는 변경 세트의 해시는 어디에 있습니까 ? 이것은이 변경 집합 것을 제거 를 포함하여 그것에서 내려 체인지 와의 손길이 닿지 않은 작업 디렉토리를 떠날 것이다 . 커밋 된 코드 변경 사항을 되돌리려면 --keep옵션을 제거하십시오 .

자세한 내용은 Strip Extension을 확인하십시오 .

“unown command ‘strip'”이 표시되면 활성화해야합니다. 그렇게하려면 .hgrc또는 Mercurial.ini파일을 찾아서 다음을 추가하십시오.

[extensions]
strip =

(머리말에서 언급 한 Juozas와 같이) 머리가 여러 개인 것은 Mercurial의 일반적인 작업 과정입니다. 스트립 명령을 사용하여 싸우지 말아야합니다. 대신 머리를 들어오는 머리와 병합하고 충돌을 해결하고 테스트 한 다음 밀어야합니다.

strip명령은 분기를 오염시키는 변경 세트를 실제로 제거하려고 할 때 유용합니다. 당신이 있다면 사실, 이 질문 의 상황과 당신이 원하는 완전히 모든 “초안”변경 세트를 제거 영구적으로 체크 아웃 상단의 대답은 기본적으로 일을 제안한다 :

hg strip 'roots(outgoing())'


답변

Hg Tortoise를 사용하는 경우 확장 ” strip “을 활성화하십시오 .

  1. 파일 / 설정 / 확장 /
  2. 스트립 선택

그런 다음 스트라이핑을 시작하려는 위치에서 아래 버전을 선택하고 다음을 선택하여 right click선택하십시오.

  1. 기록 수정
  2. 조각

이처럼 :

여기에 이미지 설명을 입력하십시오

이 예에서는 19 번째 개정에서 마지막으로 커밋 된 개정 (22)까지 지 웁니다.


답변

최신 답변 (Mercural 2.1 이후에만 해당) :

단계를 사용 하고 공유하지 않으려는 개정을 비밀 (개인)로 표시하십시오. 그렇게하면 푸시되지 않습니다.

TortoiseHG에서 커밋을 마우스 오른쪽 버튼으로 클릭하여 단계를 변경할 수 있습니다.

또한 : 확장 “rebase”를 사용하여 로컬 커밋을 끌어온 후 공유 저장소의 헤드로 이동할 수도 있습니다.


답변

다른 사람들이 지적했듯이 머리를 잡아 당긴 다음 병합해야하지만 EditingHistory 도구 없이 커밋을 제거 하려면 hg clone -r해당 변경 사항을 제외한 모든 변경 사항을 얻을 수 있습니다 .

원본 리포지토리에서 삭제되지는 않지만 새로운 복제본을 생성합니다. 그런 다음 수정 한 리포지토리를 삭제할 수 있습니다 (원하는 경우).


답변

나는이 문제를 만났다. 2 commit를 만들고 두 커밋을 모두 롤백하고 삭제하고 싶었습니다.

$ hg rollback

그러나 hg rollback두 커밋이 아닌 마지막 커밋으로 롤백합니다. 그 당시 나는 이것을 깨닫지 못했고 코드를 변경했습니다.

내가 hg rollback한 커밋을 롤백 했을 때 사용할 수 있음을 알았습니다 hg strip #changeset#. 그래서 나는 hg log -l 10최근 10 개의 커밋을 찾고 내가 원하는 올바른 변경 세트를 얻었습니다 strip.

$ hg log -l 10
changeset:   2499:81a7a8f7a5cd
branch:      component_engine
tag:         tip
user:        myname<myname@email.com>
date:        Fri Aug 14 12:22:02 2015 +0800
summary:     get runs from sandbox

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<name@email.com>
date:        Mon Aug 03 09:50:18 2015 +0800
summary:     Set current destination to a copy incoming exchange

......

$ hg strip 2499
abort: local changes found

무슨 abort: local changes found뜻입니까? hg아직 커밋되지 않은 코드에서 변경된 것을 발견 했음을 의미합니다 . 그래서,이 문제를 해결하려면 다음을 수행해야 hg diff당신이 변경 한 코드 저장 hg reverthg strip #changeset#. 이처럼 :

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
$ hg revert file_you_have_changed
$ hg strip #changeset#

위의 작업을 수행 한 후 patchdiff 파일을 사용하여 코드를 프로젝트에 다시 추가 할 수 있습니다.

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff


답변

Rebase 확장을 사용 하면이 문제를 훨씬 쉽게 해결할 수 있습니다. 사용 hg pull --rebase하면 커밋이 풀링 된 개정판에 자동으로 다시 커밋되어 분기 문제를 피할 수 있습니다.


답변

git에 익숙하다면, 다음 과 같은 histedit사용해 보시기 바랍니다git rebase -i .