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


209

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

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

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



12
어리석은 실수는 아니며, 여러 사람이 동일한 저장소를 동시에 사용하는 경우 일반적인 워크 플로우입니다.
Juozas Kontvainis

답변:


247

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

hg strip #changeset# --keep

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

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

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

[extensions]
strip =

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

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

hg strip 'roots(outgoing())'

8
@Bharath : 확장을 활성화해야합니다
Samaursa

1
수은 2.8부터 strip은 독립형 확장이므로 strip = 괜찮습니다. What'New for Mercurial 2.8
Chih-Hsuan Yen

104

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

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

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

  1. 기록 수정
  2. 조각

이처럼 :

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

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


2
File/Settings/Extensions/투표를 더 추가 할 수 있으면 좋겠습니다. 대단히 감사합니다!
dyatchenko

아아! 이 작업을 시도했지만 "백업 없음"또는 "로컬 변경 사항 무시"를 선택하지 않았지만 모든 변경 사항을 덤프하는 것 같습니다. 나는 그 변경 사항을 유지하고 싶었지만 커밋하지 않았습니다! 지금 복구 할 수있는 방법이 있습니까 ??
Tim Tisdall

2
제대로 수행 할 수있는 방법을 찾지 못하는 것 같지만 전달 해야하는 내용을 유지하는 것처럼 보이며 --keepTortoiseHg는 해당 옵션을 제공하지 않습니다. 따라서 ...로 명령 행에서 수행해야합니다 hg strip -r . --keep.
Tim Tisdall

3
스트립 도움말에서 : '제거 된 모든 변경 세트는 ".hg / strip-backup"에 번들로 저장됩니다 ( "hg 도움말 번들"및 "hg 도움말 번들 해제"참조). "hg unbundle .hg / strip-backup / BUNDLE"을 실행하여 복원 할 수 있습니다. 여기서 BUNDLE은 스트립에 의해 작성된 번들 파일입니다.
Tim Tisdall

SourceTree에서도 유용했습니다. 감사!
Ponomarenko Oleh

22

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

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

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

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


비공개 == 지금 비밀
Dmitry Osinovskiy

15

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

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


"hg clone -r"은 로컬 변경 사항을 삭제합니까? 일을 간단하게 유지하기 위해 로컬 커밋을 삭제하고 싶습니다.
user191535

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

9

나는이 문제를 만났다. 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

9

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


1
잘못된 일을하면 부정확 한 기록과 부패가 발생할 수 있습니다.
Ry4an Brase


4

hg strip당신이 찾고있는 것입니다. git reset자식에 익숙하다면 비슷 합니다.

콘솔 사용 :

  1. 개정 번호를 알아야합니다. hg log -l 10. 이 명령은 마지막 10 개의 커밋을 보여줍니다. 찾고있는 커밋을 찾으십시오. 체인지 셋 라인에서 4 자리 숫자가 필요합니다changeset: 5888:ba6205914681

  2. 그런 다음 hg strip -r 5888 --keep. 커밋 레코드는 제거하지만 모든 파일은 수정 된 상태로 유지 한 다음 다시 커밋 할 수 있습니다. (만약 --keep을 제거하기 위해 파일을 삭제하려면hg strip -r 5888


1

[Hg Tortoise 4.6.1] 최근 작업 인 경우 "롤백 / 실행 취소"작업 (Ctrl + U)을 사용할 수 있습니다.

HG 거북이 이미지


이미지 포함을 다시 확인하십시오.
Bill Keller

0

Samaursa의 탁월한 답변 외에도 evolve확장 기능을 prune안전하고 복구 가능한 버전으로 strip사용하면 문제가 발생할 경우 다시 돌아갈 수 있습니다.

내 별칭이 있습니다 .hgrc.

 # Prunes all draft changesets on the current repository
 reset-tree = prune -r "outgoing() and not obsolete()"
 # *STRIPS* all draft changesets on current repository. This deletes history.
 force-reset-tree = strip 'roots(outgoing())'

참고 prune또한이 --keep처럼은 strip, 당신이 파일을 재회 수 있도록 그대로 작업 디렉토리를 유지합니다.

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