Как с помощью Mercurial я могу «сжать» серию наборов изменений в один перед отправкой?

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

Вопрос

Допустим, у меня есть локальный и удаленный репозиторий Mercurial.Теперь я начинаю работать над функцией.Я работаю над этим и, когда думаю, что все готово, фиксирую набор изменений.Протестировав еще немного, я обнаружил, что могу еще больше улучшить эту функцию, изменив что-нибудь в коде.Я вношу изменения и фиксирую их.Через 20 минут я обнаружил ошибку в этой новой функции, поэтому исправил ее и зафиксировал и ее.

Теперь у меня есть 3 набора изменений, которые я бы очень хотел отправить в удаленный репозиторий как один набор изменений, например, с сообщением «Реализация функции X».

Как мне это сделать без особых хлопот?Я думаю, что смогу сделать это с помощью патчей, но, похоже, это требует много работы.

Это было полезно?

Решение

Другие советы

А гистедит расширение — это именно то, что вы ищете.

hg histedit -o

или

hg histedit --outgoing

отобразит список исходящих наборов изменений.Из списка вы можете

  • Сложите 2 или более набора изменений, создав один единственный набор изменений.
  • Удалить наборы изменений, удалив их из истории.
  • Измените порядок наборов изменений по своему усмотрению.

histedit предложит вам ввести новое сообщение о фиксации свернутых наборов изменений, которое по умолчанию представляет собой два сообщения с разделителем « *** ».

Вы также можете получить аналогичные результаты, используя расширение mq, но это намного сложнее.

Вы также можете использовать расширение свертывания, чтобы просто выполнить свертывание, но оно не обеспечивает такой приятный пользовательский интерфейс и не дает возможности редактировать полученное сообщение о фиксации.Редактирование полученного сообщения о фиксации также позволяет очистить окончательное сообщение, что я всегда использую.

Да, вы можете сделать это с патчами: Давайте предположим, что ваша работа состоит из ревизий от 100 до 110 включительно

<Ол>
  • Создать патч:

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

  • Обновление до 99:

    % hg update 99

  • Примените патч с параметром --no-commit (иначе вы вернете все свои наборы изменений):

    % hg import --no-commit mypatch

  • Передайте все изменения сразу:

    % hg commit

  • Теперь у вас есть две головы (110 и 111), которые должны быть эквивалентны с точки зрения файлов, которые они производят в вашем рабочем каталоге, - возможно, рассмотрите их для здравого смысла перед удалением старых:

    % hg strip 100

  • Хорошо, теперь, когда я все это изложил, это кажется длинным, но, выполнив это несколько раз самому, я не считаю, что это слишком хлопотно ...

    Если вы используете TortoiseHg, команда use может просто выбрать две ревизии (используйте CTRL для выбора непоследовательных), щелкните правой кнопкой мыши и выберите " Сжать историю " .

    После этого вы получите новый список изменений в новом заголовке, начиная с первого выбранного ранее изменения, он будет содержать все списки изменений потомков между выбранными вами.

    Вы можете просто удалить старые списки изменений, если они вам больше не нужны: используйте для этого расширения MQ . Опять же, в TortoiseHg: щелкните правой кнопкой мыши первый список изменений, который необходимо удалить со всеми его потомками, " Изменить историю - > Газа & Quot;.

    Мой предпочтительный метод использования 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 , чтобы аварийно завершить работу с дампом стека в течение трех минут. Свернуть не намного лучше.

    Думаю, я мог бы поделиться двумя другими BKM:

    <Ол>
  • hg rebase --collapse

    Это расширение распространяется с Mercurial. У меня еще не было проблем с этим. Возможно, вам придется поиграть в некоторые игры, чтобы обойти ограничения hg rebase - в основном, он не любит перебазирование к предку в той же ветке, именованной или по умолчанию, хотя он допускает это, если перебазировка между (именованные) ветви.

  • Переместите репозиторий ( 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, но это очень похоже на то, о чем говорил Мартин Фаулер в своем блоге не так давно:

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

    Почему бы просто не выполнить команду hg strip --keep ?

    Затем вы можете зафиксировать все изменения как один.

    HistEdit будет делать то, что вы хотите, но это, вероятно, излишне. Если единственное, что вам нужно, - это сложить несколько наборов изменений вместе, Расширение свертывания выполнит эту работу.

    Предположим, у вас есть два неопубликованных коммита THIS и THAT в Mercurial, и им нравится объединяться в один коммит в THIS point ::

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

    Убедитесь, что ваши коммиты не опубликованы ::

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

    Обновить до LAST commit ::

    $ hg up
    

    и импорт фиксирует до ЭТОГО в MQ ::

    $ hg qimport $THIS::.
    

    Отмените все исправления и примените только сначала ЭТО ::

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

    Присоединяйтесь к ЭТО ::

    $ 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