2009-11-12 2 views
85

У меня есть пара коммитов, которые действительно должны быть только одним. Если бы я использовал git, я бы использовал:Могу ли я выкачать в Mercurial?

git rebase -i <some-commit-before> 

а затем раздавить их.

Могу ли я сделать это в меркуриальном? Если да, то как?

+0

@ Ry4an: Спасибо, не заметил, что (разные слова). –

+0

Да, мне понадобилось некоторое время, чтобы найти это, потому что ваш вопрос был более ясным. –

ответ

80

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

В качестве альтернативы, если вы хотите использовать расширение, которое вы могли бы использовать:

+0

Да, я ловил этот ответ из вопросов обманы, которые мне нравились в моем комментарии к общему вопросу. Я думаю, это ваш ответ на этот вопрос. –

+0

Расширение Collapse было легко установить и очень прост в использовании, именно то, что я искал! – MattGWagner

+3

Небольшая заметка: расширение Histedit распространяется вместе с Mercurial 2.3 и более поздними версиями. Вам просто нужно включить его. – Paidhi

35

Моя любимая hg strip --keep команда. И затем я фиксирую все изменения в одном коммите.

Это самый быстрый и удобный способ для меня, потому что я хотел сделать много небольших фиксаций во время моей ежедневной работы;)


Примечание 1: strip необходим встроенное расширение mq быть включено ,
Примечание 2: Мой любимый клиент Git/Mercurial (SmartGit/Hg) добавляет по умолчанию параметр --keep во время strip. И что еще более удобно: он предоставляет опцию под названием join commits:]

+4

Полная команда для полосы hg: 'hg strip --keep --rev [rev]' Где 'rev' - это номер редакции первого коммита, который вы хотите сквош с последним –

+3

@NicolasForney Не совсем,' --rev' является необязательным, полная команда 'hg strip --keep [rev]' –

+0

Редакция обязательна для меня в 3.3.3: 'hg help strip' дает' hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV ... 'и опускать ревизию дает мне« abort: empty revision set ». –

21

Rebase extension работал как шарм. Для сквоша 2 фиксации:

$ hg rebase --dest .~2 --base . --collapse 

Dot - это ярлык для текущей ревизии.

Это даже проще, когда у вас есть несколько фиксаций на ветке и хотите, чтобы свернуть их все в одном:

$ hg rebase --dest {destination branch (e.g. master)} --base . --collapse 

Как это работает:

enter image description here

(от http://mercurial-scm.org/wiki/RebaseExtension#Collapsing)

+0

это прекрасно! – phouse512

+0

Где вы нашли «~ 2» для двух коммитов? –

+0

Это объясняется в разделе реверсов, см. Hg help revsets. – markand

5

Если вы читаете этот ответ, то можете забыть о других ion , упомянутый в этом ответе, и используйте команду fold от evolve extension.

evolve является продолжением меркуриального, что помогает нам иметь безопасную изменчивую историю, однако она все еще экспериментальна. Вы можете использовать его, клонируя его из своего repo и добавляя его в свой .hgrc, как это.

[extensions] 
evolve = ~/evolve/hgext/evolve.py 

Предполагая, что вы клонировали эволюцию репо в своем домашнем каталоге. Теперь вам хорошо идти. Вы также можете обратиться за помощью по телефону hg help fold.

Fold Command

Вы говорите fold в сквош/фолд линейную цепочку фиксаций, которая не нарушается. В том, что делает сгиб, он создает новый набор изменений, который содержит изменения из всех наборов изменений и отмечает все эти фиксации как устаревшие. У вас может быть более глубокий вид на docs.

Теперь предположим, что у вас есть следующая история.

a -> b -> c -> d -> e -> f -> g 

Вы хотите сквош e, f и g. Вы можете сделать

hg up g 
hg fold -r e 

Результат будет

a -> b -> c -> d -> h 

где h набор изменений, который содержит изменения от всех трех фиксаций e, f и g.

Вы также можете сбрасывать набор изменений из середины истории, то есть не обязательно выбирать цепочку, содержащую подсказку. Предположим, вы хотите сбросить b, c и d. Вы можете сделать

hg up d 
hg fold -r b 
hg evolve --all 

Это приведет к

a -> i -> j 

где i является сложенный из b ревизии, c, d и j такая же, как h ревизии. Evolve user guide является обязательным для чтения.

+0

Похоже, что в большинстве случаев (возможно, все?) Используются бонусы, которые используются в этом случае, и, конечно, тот, которого задают в этом вопросе. Функция убийцы этого расширения состоит в том, чтобы скрыть (а не удалить) изменения, которые вы замените, но опция «-keep» для переадресации охватывает это (с последующим разметкой ревизий как секретными или использованием полосы на них после проверки результат). Даже перемещение изменений между другими версиями возможно с помощью последовательности из двух команд rebase. –

+0

... плюс, если вы делаете что-то действительно сложное, вы всегда можете просто клонировать локальное репо, чтобы использовать его в качестве резервной копии. Учитывая то, насколько редко (надеюсь!), То есть меньше усилий, чем изучение того, как использовать совершенно новое расширение. –

Смежные вопросы