2009-05-28 2 views
12

Bazaar에는 훌륭한 커밋 인 uncommit 명령이 있습니다.이 커맨드는 단순히 마지막 커밋을 취소합니다. Mercurial에 해당하는 항목이 있습니까?"bzr uncommit"은 Mercurial과 동일합니까?

편집은 : - 당신이 너무 늦게 커밋 메시지에 오타가 있다는 것을 알 때, 예를 들어,이 제거 유용 커밋 마지막 및 관련 데이터 (또는 파일 아니었다 바자의 uncommit 명령은 파일을 수정하지 않습니다 덧붙여 야했다). 예를 들어

:

$ bzr ci -m "Fixed a proooblem" <-- problem is misspelt 
$ bzr uncommit 
... 
$ bzr ci -m "Fixed a problem" <-- Exactly as if the first commit was correct. 

답변

8

hg backout tip? hg backout에 대한 모든 세부 사항은 http://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html이며, hg revert과 어떻게 다른지, 그리고 많은 관련 주제를 추천하지만, 내가 undestand 일 경우 uncommit은 정확하게 hg backout tip과 같습니다.

편집 : 댓글에서 "기록 삭제"를 원했음 - 어렵지 않음 (그리기가 매우 빠르지 않는 한, 아마도 ... -) ... 빨간 콩 책마다 다시 :

Mercurial은 기록을 누적 적으로 처리하므로 모든 변경 사항은 이전의 모든 변경 사항 위에 추가됩니다. 일반적으로 비참한 변경 사항은 사라지게 할 수 없습니다. 단 한 가지 예외는 방금 변경 사항을 커밋 한 후 밀어 넣거나 다른 저장소로 가져 오지 않은 경우입니다. 그냥 "이 사라지게"하려고 할 (당신이 그것을 아직 밀려 또는 다른 곳에서 가져온되지 않았 음을 충분히 운이 좋다) 경우 안전하게

그래서 HG 롤백 명령을 사용할 수 있습니다 때이다 , 그러면 hg rollback가 더 좋은 방법 일 수 있습니다!

+0

닫기,하지만 아주. 'bzr revert'는 모든 파일을 그대로 두어 다시 커밋 할 준비가됩니다. –

+0

"bzr uncommit"을 의미합니까? –

+0

오류가 있습니다. 예, 맞습니다 ... 고마워요. –

0

이 없습니다 "HG 되돌리기"그렇게합니까?

+0

정확합니다. hg revert는 동일한 명령입니다. –

+0

파일을 되돌릴 수는 있지만 전체 커밋 (메시지 및 전체)을 기록에서 삭제하고 싶습니다. –

+0

아니면 'hg help revert'가 나에게 보이지 않는 것이 아닌가? –

0

코멘트를 읽는 것으로 파일 변경을 취소하지 않고 커밋 레코드를 제거하는 방법이 필요합니다. Mercurial에는 자동화 된 방법이 없습니다. hg revert과 같이 가깝습니다.

그러나 일 수 있습니다. 몇 가지 수동 단계로 수행하십시오. hg revert을 호출 할 때 기본 동작은 되 돌리는 변경 집합에있는 파일을 가져 와서 filename.ext.orig으로 바꿉니다. 여기서 ext은 파일의 원래 확장명입니다. 되 돌린 버전은 원래 파일 이름을 사용합니다. 따라서 수행 할 수있는 작업은 hg revert이며, 원래 이름의 파일을 삭제하고 백업 파일 이름에서 .orig을 제거하십시오. 그런 다음 수정 된 로그 메시지로 다시 커밋하십시오. 팁이 아닌 다른 리비전으로는이 작업을 수행하지 마십시오. 변경된 파일이 많아서 어떤 파일이 어떤 changeset에 속했는지 잊어 버릴 수 있기 때문입니다.

이미 원격 저장소로 변경 집합을 푸시 한 경우이 작업을 수행하지 않는 것이 좋습니다. 모든 것이 여전히 로컬 일 경우에만 수행하십시오.

추가 설명이 필요하면 알려주세요. 나는 때때로 이것을해야했기 때문에 나는이 과정에 익숙하다.

+0

댓글을 주셔서 감사합니다. 그러나 'hg rollback'이 내가 찾고있는 것 같아요. –

+0

롤백에 대한 hg 명령 줄 도움말에서 "마지막 트랜잭션이 수행 될 때 dirstate도 복원됩니다." 네가 피하려고하는 것이 아닌가? –

+0

@Marc : 아니, 그는 다시 목마름을 원한다. 그것이 예를 들어 추가 된 파일을 추적합니다. 따라서 "hg add foo.c; hg commit; hg rollback"은 "hg status"에 따라 foo.c를 남겨 둡니다. –

23

hg rollback 명령을 원하지만 아래에서 Mercurial 2.2 이상을 사용하고 있는지 확인하십시오.

롤백 명령은 저장소에서 마지막 트랜잭션을 제거합니다. 하지만, 당신은 롤백 후

% hg commit -m 'My elaburate bugfix.' foo.c foo.h 
% hg rollback 
% hg commit -m 'My elaborate bugfix.' foo.c foo.h 

으로 사용할 수 있도록 커밋은 수정 된 파일이 다시 보일 것이다, 트랜잭션, 그리고이 두 번째는 첫 번째와 같은 변경 사항을 저장합니다 커밋을 의미합니다 더 나은 커밋 메시지.

주의 :hg rollback 간단한 "uncommit"기능보다 더 강력하고 당신이 조심하지 않으면 당신이 직장을 던져 로 사용할 수 있습니다. 멀리 던져

$ hg commit -m 'My big and very difficult bugfix' 
$ hg pull --update 
$ hg rollback 

을 커밋 이제 마지막으로 당신이 만든 당신이 다른 버전으로 작업 복사본을 업데이트하기 때문에, 커밋에서 변경 을 사라 커밋 잃었습니다. 그러므로 hg commit이 실제로 작업 카피에서 작동 한 마지막 명령이라는 확신이있는 경우에만 hg rollback을 사용하여 커밋을 실행 취소해야합니다.

또한 명령 줄에서 커밋 메시지를 제공하지 않은 경우 롤백 후 커밋을 다시 실행하기 위해 위쪽 화살표를 두 번 누르면 안됩니다. 그러나 Mercurial 1.5 이상에서는 마지막 커밋 메시지를 .hg/last-message.txt에 저장하므로 롤백 후에 언제든지 다시 찾을 수 있습니다.

머큐리얼 2.2는 hg commit에 대해 --amend 플래그을가집니다. 이것으로 새로운 커밋으로 마지막 커밋을 수정합시다.에 의해 나열된 변경 사항을 단순히 상위 커밋에 통합합니다 (롤백하고 다시 커밋 한 것처럼).

0

또한 "mq"확장자의 "hg strip"명령이 있습니다. "bzr uncommit"과 거의 동일합니다. 그러나 잘못한 커밋을 이전에 다른 저장소로 밀어 넣었을 때 가장 가까운 위치에서 다시 작성됩니다.

+0

죄송합니다, 이것은 틀린 것입니다 -'hg strip'은 저장소에서 changesets를 삭제할 것이고'bzr uncommit'은 저장소와 작업 트리를 커밋 직전의 상태로 되돌릴 것입니다. –

+0

글쎄, 정확히 내가 왜 '거의'라는 단어를 사용했는지 - 유일한 차이점은 작업 디렉토리의 상태 인 것 같습니다. 나는 이것이 'bzr uncommit'(그리고 슬프게도, 명백하지 않은 것, 그래서 찾기가 어렵다)을위한 유일하게 의욕적 인 등가물이기 때문에 언급 할 가치가 있다고 생각했다. 커밋 직후에 여러 개의 changesets를 제거 할 수있다. Bazaar 문서에 따르면, bzr uncommit이 그렇게 할 수 있습니다. 여러 변경 집합 (예 : 'bzr uncommit -r 1')을 제거 할 수있는 다른 역사가있는 Mercurial 명령을 알고있는 경우 알려 주시기 바랍니다. 그것에 대해 배울 수있어서 기쁩니다. –