Mercurial을 사용하면 밀기 전에 일련의 변경 사항을 하나로 "압축"할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1200691

문제

로컬 및 원격 수은 저장소가 있다고 가정 해 봅시다. 이제 기능 작업을 시작합니다. 나는 그것에 대해 노력하고 있으며, 그것이 끝났다고 생각할 때, 나는 Changes 세트를 커밋합니다. 조금 더 테스트하면 코드에서 무언가를 조정 하여이 기능을 더욱 향상시킬 수 있습니다. 나는 변화를하고 커밋합니다. 20 분 후, 나는이 새로운 기능에 버그가 있다는 것을 알았으므로 수정하고 그것을 약속합니다.

예를 들어 "기능 X 구현"메시지가 포함 된 하나의 변경 세트로 원격 저장소로 푸시하고 싶은 3 개의 변경 사항이 있습니다.

많은 번거 로움없이 어떻게 할 수 있습니까? 나는 패치로 그것을 할 수 있다고 믿지만 많은 일처럼 보인다.

도움이 되었습니까?

해결책

어때 붕괴 확장?

다른 팁

그만큼 역사 확장은 정확히 당신이 찾고있는 것입니다.

hg histedit -o

또는

hg histedit --outgoing

나가는 변경 사항 목록을 제시합니다. 목록에서 할 수 있습니다

  • 2 개 이상의 변경 사항을 접어 하나의 단일 변경 세트를 만듭니다
  • 드롭 변경 세트는 역사에서 제거합니다
  • 그러나 원하는 변경 사항을 재주문합니다.

Histedit은 접힌 변경 사항의 새로운 커밋 메시지를 메시지로 표시하여 " n *** n"을 분리하여 두 메시지로 기본적으로 표시됩니다.

MQ 확장을 사용하여 유사한 결과를 얻을 수 있지만 훨씬 더 어렵습니다.

붕괴 확장을 사용하여 접는 것만으로 만 접을 수 있지만 UI를 멋진 UI로 제공하지 않으며 결과 커밋 메시지를 편집 할 수있는 방법을 제공하지 않습니다. 결과 커밋 메시지를 편집하면 최종 메시지를 정리할 수 있습니다. 이는 항상 내가 활용하는 것입니다.

예, 패치로 할 수 있습니다 : 작업이 100 ~ 110, 포함되어 있다고 가정 해 봅시다.

  1. 패치 만들기 :

    % hg export -o mypatch 100:110 --git

  2. 99로 업데이트 :

    % hg update 99

  3. -no-commit으로 패치를 적용합니다 (그렇지 않으면 모든 변경 사항을 다시 얻을 수 있습니다) :

    % hg import --no-commit mypatch

  4. 한 번에 모든 변경 사항을 커밋하십시오.

    % hg commit

  5. 이제 두 개의 헤드 (110 및 111)가 있습니다.이 헤드 (110 및 111)는 작업 디렉토리에서 생성 된 파일 측면에서 동등해야합니다. 아마도 이전 항목을 제거하기 전에 정신을 위해 차이가있을 수 있습니다.

    % hg strip 100

좋아, 이제 모든 철자를 썼으니, 그것은 길어 보이지만, 여러 번 스스로 해본 적이 있다면 너무 많은 집안일이라는 것을 알지 못한다 ...

Tortoisehg를 사용하는 경우 사용은 두 가지 개정판을 선택할 수 있습니다 (CTRL을 사용하여 비 서제를 선택하십시오). 마우스 오른쪽 버튼을 클릭하고 선택하십시오. "역사 압축".

그 후에 당신이 이전에 선택한 첫 번째 변경에서 시작하여 새로운 헤드에서 새로운 변경 목록을 얻을 수 있습니다. 선택한 것들 사이의 모든 후손 변경 목록이 포함됩니다.

더 이상 필요하지 않은 경우 오래된 변경 목록을 제거 할 수 있습니다. MQ 그것에 대한 확장. 다시 말하지만, Tortoisehg : 모든 후손들과 함께 제거 해야하는 첫 번째 변경 목록을 마우스 오른쪽 버튼으로 클릭하십시오. "역사 수정 -> 스트립".

이 접이식에 MQ를 사용하는 것이 선호하는 방법은 Tortoisehg를 사용하는 것입니다. 여기에 설명 된대로. 그러나 다음과 같은 명령 줄에서 쉽게 수행 할 수 있습니다.

hg qimport -r <first>:<last> 
    -- where <first> and <last> are the first and last changesets 
    -- in the range of revisions you want to collapse

hg qpop <first>.diff
    -- remove all except for the first patch from the queue
    -- note: mq names patches <#>.diff when it imports them, so we're using that here

hg qfold <next>.diff
    -- where <next> is <first>+1, then <first>+2, until you've reached <last>

hg qfinish -a
    -- apply the folded changeset back into the repository

(Qfold 단계를 수행하는 더 좋은 방법이있을 수 있지만, 나는 보통 그 작업에 Tortoisehg를 사용하기 때문에 그것을 알지 못합니다.)

처음에는 약간 복잡해 보이지만 MQ를 사용하기 시작하면 매우 간단하고 자연 스럽습니다. 또한 MQ로 모든 종류의 다른 일을 할 수 있으며 매우 편리합니다!

hg collapse 그리고 hg histedit 가장 좋은 방법입니다. 또는 오히려 그들이 안정적으로 일했다면 가장 좋은 방법이 될 것입니다 ... 나는 얻었습니다. histedit 3 분 안에 스택 덤프와 충돌합니다. Collapse 그다지 더 나은 것은 아닙니다.

다른 BKM을 공유 할 수 있다고 생각했습니다.

  1. hg rebase --collapse

    이 확장은 Mercurial과 함께 배포됩니다. 아직 문제가 없었습니다. 작업하려면 일부 게임을해야 할 수도 있습니다. hg rebase 제한 사항 - 기본적으로 (명명 된) 분기 사이에 리바스를하는 경우와 같은 지점의 조상에게 리바스하는 것을 좋아하지 않습니다.

  2. 저장소 이동 (foo/.hg) 작업 디렉토리에 (bar)) 및 파일. 다른 방법은 아닙니다.

어떤 사람들은 두 개의 복제 나무를 만들고 그들 사이에 파일을 복사하는 것에 대해 이야기했습니다. 또는 그들 사이에 패치. 대신, 이동하기가 더 쉽습니다 .hg 디렉토리.

hg clone project work
... lots of edits
... hg pull, merge, resolve
hg clone project, clean
mv work/.hg .hg.work
mv clean/.hg work/.hg
cd work
... if necessary, pull, nerge, reconcile - but that would only happen because of a race
hg push

이것은 진정한 저장소만큼 오래 작동합니다. .hg 나무는 작업 디렉토리 및 파일과 무관합니다.

그들이 독립적이지 않다면 ...

나는 Mercurial을 사용한 적이 없지만 이것은 Martin Fowler가 자신의 블로그에서 얼마 전까지까지 이야기했던 것과 비슷합니다.

http://martinfowler.com/bliki/mercurialsquashcommit.html

왜 그냥 hg strip --keep 명령?

그런 다음 모든 변경 사항을 하나의 커밋으로 커밋 할 수 있습니다.

Histedit은 원하는대로 할 것이지만 아마도 과잉 일 것입니다. 필요한 유일한 것은 몇 가지 변경 사항을 함께 접는 것입니다. 붕괴 확장 일을 할 것입니다.

두 개의 미공개가 있다고 가정 해 봅시다 THIS 그리고 THAT Mercurial에서 커밋하고 그들이 단일 커밋에 참여하기를 좋아합니다. THIS 가리키다::

... --> THIS --> ... --> THAT --> ... --> LAST

커밋이 게시되지 않은지 확인하십시오 ::

$ hg glog -r "draft() & ($THIS | $THAT)"

업데이트 LAST 저지르다::

$ hg up

수입은 최대 커밋됩니다 THIS MQ로 ::

$ hg qimport $THIS::.

모든 패치를 적용하고 먼저 적용하십시오 THIS::

$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...

가입하십시오 THAT::

$ hg qfold $THATNAME

노트 이름을 찾으려면 THATNAME 사용::

$ hg qseries

모든 패치를 적용하고 저장소 기록 ::로 옮깁니다.

$ hg qpush -a
$ hg qfinish -a

주제에 대한 내 블로그 게시물입니다 Mercurial에서 두 커밋에 합류했습니다.

예, strip --keep 저자의 질문을 위해 작동합니다. 그러나 예를 들어 1에서 30까지 버전이 있지만 버전 12-15 만 붕괴하려는 경우 다른 사람들과 약간 달랐습니다. 다른 솔루션은 작동하지만 그렇지 않습니다 strip --keep.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top