git commit --amend
Mercurial 의 상대 부분 , 즉 작업 복사본이 연결된 커밋을 수정하는 방법을 찾고 있습니다. 나는 임의의 이전 커밋이 아닌 마지막 커밋에만 관심이 있습니다.
이 수정 절차의 요구 사항은 다음과 같습니다.
-
가능하면 확장이 필요하지 않습니다. 그것은 있어야 기본이 아닌 확장이 필요하지 , 공식 의욕 설치 오지 않는, 즉 확장.
-
수정하려는 커밋이 현재 지점의 헤드 인 경우 새 헤드를 만들면 안됩니다. 커밋이 헤드가 아닌 경우 새 헤드가 생성 될 수 있습니다.
-
절차는 어떤 이유로 든 수정이 실패하는 경우 수정 전과 동일한 작업 복사본 및 저장소 상태를 복원하려는 방식 으로 안전 해야합니다 . 다시 말해, 수정 자체가 실패 할 경우 작업 사본 및 저장소 상태를 복원하는 실패 방지 절차가 있어야합니다. 파일 시스템 관련 문제 (예 : 액세스 제한, 쓰기를 위해 파일을 잠글 수 없음)가 아니라 수정 절차 (예 : 충돌)의 본질 인 “실패”를 언급하고 있습니다. )
업데이트 (1) :
- 프로시 저는 자동화 가능 해야 하므로 사용자 조작없이 GUI 클라이언트가이를 수행 할 수 있습니다.
업데이트 (2) :
- 작업중인 디렉토리의 파일은 건드리지 않아야합니다 (특정 수정 된 파일에는 파일 시스템 잠금이있을 수 있음). 이는 특히 가능한 접근 방식이 깨끗한 작업 디렉토리를 요구하지 않을 수 있음을 의미합니다.
답변
Mercurial 2.2 릴리스에서는 --amend
with 옵션을 사용 hg commit
하여 현재 작업 디렉토리로 마지막 커밋을 업데이트 할 수 있습니다
로부터 명령 줄 참조 :
–amend 플래그는 현재 hg 상태에 의해보고 된 변경 사항이있는 경우 부모의 변경 사항이 포함 된 새 커밋으로 작업 디렉토리의 부모를 수정하는 데 사용할 수 있습니다. 이전 커밋은 .hg / strip-backup의 백업 번들에 저장됩니다 (hg 도움말 번들 및 hg 도움말에서 복원 방법에 대한 번들 해제 참조).
메시지, 사용자 및 날짜는 지정되지 않은 한 수정 된 커밋에서 가져옵니다. 명령 행에 메시지를 지정하지 않으면 수정 된 커밋 메시지와 함께 편집기가 열립니다.
가장 좋은 점은이 메커니즘이 “안전”하다는 것입니다.이 메커니즘은 비교적 새로운 “단계”기능을 사용하여 로컬 리포지토리 외부에서 이미 사용 가능한 기록을 변경하는 업데이트를 방지하기 때문입니다.
답변
Mercurial에서 커밋을 편집 할 수있는 3 가지 옵션이 있습니다.
-
hg strip --keep --rev -1
마지막 커밋을 취소하면 다시 할 수 있습니다 ( 자세한 내용 은 이 답변 참조 ). -
Mercurial과 함께 제공되는 MQ 확장 사용
-
Mercurial과 함께 제공되지 않더라도 Histedit 확장 프로그램은 언급 할 가치가 있습니다.
Mercurial 위키 의 편집 히스토리 페이지를 볼 수도 있습니다 .
간단히 말해서 편집 기록은 정말 어렵고 권장되지 않습니다 . 이미 변경 사항을 적용한 경우 다른 모든 클론을 완전히 제어 할 수있는 경우를 제외하고는 수행 할 수있는 작업이 거의 없습니다.
나는 git commit --amend
명령에 익숙하지 않지만 AFAIK, Histedit는 가장 가까운 접근법 인 것처럼 보이지만 슬프게도 Mercurial과 함께 제공되지 않습니다. MQ는 사용하기가 정말 복잡하지만 거의 모든 작업을 수행 할 수 있습니다.
답변
다음에 해당하는 GUI hg commit --amend
:
이것은 TortoiseHG의 GUI에서도 작동합니다 (v2.5를 사용하고 있습니다).
‘커밋’보기에 들어가거나 워크 벤치보기에서 ‘작업 디렉토리’항목을 선택하십시오. ‘커밋’버튼에는 ‘현재 개정 수정’이라는 옵션이 있습니다 (버튼을 보려면 드롭 다운 화살표를 클릭하십시오).
||
||
\/
주의 사항 :
이 추가 옵션은 수은 버전이 2.2.0 이상이고 현재 개정판이 공개 버전이 아닌 경우 패치가 아니고 하위가없는 경우에만 활성화됩니다. […]
버튼을 클릭하면 수정을 ‘수정’하기 위해 ‘commit –amend’가 호출됩니다.
THG dev 채널에 대한 자세한 정보
답변
나는 krtek이 쓴 것을 튜닝하고 있습니다. 더 구체적으로 해결책 1 :
가정 :
- 하나의 (!) 변경 세트를 커밋했지만 아직 푸시하지 않았습니다.
- 이 변경 세트를 수정하려고합니다 (예 : 파일 추가, 제거 또는 변경 및 / 또는 커밋 메시지)
해결책:
hg rollback
마지막 커밋을 취소하는 데 사용- 새로운 변경 사항을 적용하여 다시 커밋
롤백은 실제로 마지막 작업을 취소합니다. 작업 방법은 매우 간단합니다. HG의 일반적인 작업은 파일에만 추가됩니다. 여기에는 커밋이 포함됩니다. Mercurial은 마지막 트랜잭션의 파일 길이를 추적하므로 파일을 이전 길이로 다시 잘라서 한 단계를 완전히 취소 할 수 있습니다.
답변
아직 변경 사항을 전파하지 않았다고 가정하면 다음을 수행 할 수 있습니다.
-
.hgrc에 추가하십시오.
[extensions] mq =
-
저장소에서 :
hg qimport -r0:tip hg qpop -a
물론 마지막 하나의 팝 (
hg qpop
) 만으로도 수정 0으로 시작하거나 모든 패치를 팝할 필요는 없습니다 (아래 참조). -
.hg/patches/series
파일 의 마지막 항목 또는 원하지 않는 패치를 제거하십시오 . 재주문도 가능합니다. hg qpush -a; hg qfinish -a
.diff
.hg / patches에 있는 파일 (적용되지 않은 패치)을 제거하십시오 (귀하 의 파일이어야 함).
당신이 경우 싶지 않아 하는 모든 철회 당신의 패치를, 당신은 사용하여 편집 할 수 있습니다 hg qimport -r0:tip
, 다음 편집 물건과 사용 (또는 유사) hg qrefresh
하여 스택의 맨 위의 패치에 변경 내용을 병합 할 수 있습니다. 읽어보십시오 hg help qrefresh
.
편집 .hg/patches/series
하면 여러 패치를 제거하거나 순서를 바꿀 수도 있습니다. 마지막 개정판이 99이면를 사용할 수 있습니다 hg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a
.
물론이 절차 는 매우 권장되지 않으며 위험 합니다. 이 작업을 수행하기 전에 모든 것을 백업 하십시오!
참고로 개인 전용 리포지토리에서 수백만 번을 수행했습니다.
답변
최신 버전의 Mercurial에는 명령 evolve
을 제공하는 확장 기능이 포함되어 있습니다 hg amend
. 이를 통해 버전 관리에서 사전 수정 내역을 잃지 않고 커밋을 수정할 수 있습니다.
hg 수정 [OPTION] … [FILE] …
별칭 : 새로 고침
변경 세트를 업데이트와 결합하여 새 것으로 교체
Commits a new changeset incorporating both the changes to the given files and all the changes from the current parent changeset into the repository. See 'hg commit' for details about committing changes. If you don't specify -m, the parent's message will be reused. Behind the scenes, Mercurial first commits the update as a regular child of the current parent. Then it creates a new commit on the parent's parents with the updated contents. Then it changes the working copy parent to this new combined changeset. Finally, the old changeset and its update are hidden from 'hg log' (unless you use --hidden with log).
확장에 대한 자세한 설명은 https://www.mercurial-scm.org/doc/evolution/user-guide.html#example-3-amend-a-changeset-with-evolve 를 참조 하십시오evolve
.
답변
원래 질문의 모든 문제를 해결할 수는 없지만 이것은 수은이 이전 커밋을 어떻게 수정할 수 있는지에 대한 사실상의 게시물처럼 보이므로 2 센트 분량의 정보를 추가 할 것입니다.
나처럼 파일을 추가하지 않고 이전 커밋 메시지 (오타 수정 등) 만 수정하려는 경우 작동합니다.
hg commit -X 'glob:**' --amend
포함 또는 제외 패턴 hg commit
이 없으면 기본적으로 작업 디렉토리의 모든 파일이 포함됩니다. 패턴 -X 'glob:**'
을 적용하면 가능한 모든 파일이 제외되고 커밋 메시지 만 수정할 수 있습니다.
기능적 git commit --amend
으로 인덱스 / 스테이지에 파일이없는 경우 와 동일 합니다.