Вопрос по – Каков наилучший способ отменить несколько наборов изменений в Mercurial?

16

Является ли наиболее надежным методом перехода один за другим, используя команду возврата для каждого из множества наборов изменений, или есть способ создать один большой реверсивный набор изменений, чтобы охватить целую кучу[edit: non-contiguous] Изменения.

Если один за другим, имеет ли значение заказ? (Стоит ли идти первым-первым?)

Отличается ли лучший метод, если по пути встречаются слияния между различными подпроектами?

Это имеет тенденцию идти гладко в вашем опыте? :-)

Экспорт не имеет флага --reverse, моя ошибка там. Joshua Goldberg
Я вижу разные возможные команды, которые могут иметь отношение. diff -r может принимать несколько ревизий, но я не совсем понимаю точную семантику. export -r принимает несколько наборов изменений. Откат занимает один. Я не уверен в достоинствах и недостатках каждого Joshua Goldberg

Ваш Ответ

5   ответов
4

что я придумал, не элегантно, но выполнило работу, несмотря на то, что изменения, которые мне нужно было отменить, были перемежены с другой работой и имели некоторое внутреннее ветвление. Вот что я сделал. (Комментарии и улучшения приветствуются.)

Получил список всех наборов изменений (которые я затем использовал для генерации команд ниже):

hg log -r 'keyword(xyz)' --template '{rev}\n'

Сгенерировал патч для каждой ревизии:

hg diff -p -U 8 --reverse -c 15094 > 15094.rev.patch
hg diff -p -U 8 --reverse -c 15095 > 15095.rev.patch
...

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

hg import -m "reversing changeset 15302" 15302.rev.patch
hg import -m "reversing changeset 15292" 15292.rev.patch
...

Этот процесс несколько раз прерывался из-за слияний, которые не проходили автоматически, когда мне приходилось вручную вносить изменения в файл из его файла .rej, а затем фиксировать их вручную, прежде чем приступить к импорту, который был прерван.

Наконец (в другом клоне ... я упоминал, что сделал все это в клоне?), Я сжал весь набор обратных наборов в одну, используяhg histedit -o и его команда сгиба.

Теперь у меня есть один набор изменений, который я смогу отменить и применить, если я решу вернуться к работе позднее (хотя, если я перейду этот мост, я смогу снова применить пошаговые патчи & quot; forward & quot; в Для того, чтобы лучше обвинить / аннотировать информацию)

Error: User Rate Limit Exceededhelp diffError: User Rate Limit Exceeded Joshua Goldberg
5

--collapse вариант дляrebase.

Хельги& APOS; sответ может быть улучшен до:

1 -- A -- 2 -- B -- 3 -- C -- 4 -- 5
                          \
                           C' -- B' -- A'

$ hg update --clean C
$ hg backout --rev C --message "Backed out changeset: C"
$ hg backout --rev B
$ hg commit --message "Backed out changeset: B"
$ hg backout --rev A
$ hg commit --message "Backed out changeset: A"
$ hg rebase --collapse --source C' --dest 5
$ hg commit --message "Backed out C, B, A"

что приведет к следующему

1 -- A -- 2 -- B -- 3 -- C -- 4 -- 5 -- C'B'A'

Однако возврат в отдельную ветку может привести к[logical] конфликт в последующем слиянии.

1 -- A -- 2 -- B -- 3 -- X  --  4 
                     \           \
                      B' -- A' -- M

еслиX зависит отA или жеB, затемM будет конфликт(at least logical conflict).

Error: User Rate Limit Exceededdiff --reverseError: User Rate Limit Exceeded Joshua Goldberg
Error: User Rate Limit ExceededbackoutError: User Rate Limit ExceededrebaseError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded"The only safe way to deal with a bad merge is to abandon the branch." Joshua Goldberg
1

Конечно, вы можете сделать то же самое с командной строкой.

Учитывая эту историю, где вы хотите избавиться от изменений A, B и C:

1 -- 2 -- A -- B -- C -- 3 -- 4

Первое обновление до версии 2.

Затем перебазируйте первую из любых последующих ревизий, которые вы хотите сохранить - в данном случае ревизию 3.

Ваша история теперь выглядит так:

1 -- 2 -- A -- B -- C
      \
       3 -- 4

Теперь обновите до версии 4.

И, наконец, используйте & quot; Объединить с локальным & quot; объединить редакцию C с редакцией 4.

At this point it is crucial that you select the option "Discard all changes from merge target (other) revision".

Описание может быть не самым логичным, но это означает, что вы объединяете старый совет C обратно в ветку по умолчанию - но без наборов изменений A, B и C.

Результат:

1 -- 2 -- A -- B -- C --
      \            /
       3    --    4

Подтвердите, и вы сделали.

Error: User Rate Limit Exceeded Joshua Goldberg
Error: User Rate Limit Exceeded
0

отступать & quot; Изменения в вашей истории, вы также можете сделать что-то еще:
Создайте клон своего хранилища, но только до последней ревизии, от которой вы не хотите избавляться.

УвидетьMercurial: исправление поврежденной истории например, как это сделать.

Если ваш репозиторий был локальным, это все, что вам нужно сделать.
But если неправильные наборы изменений уже были отправлены в центральное хранилище, вам необходим доступ к серверу, чтобы удалить хранилище и заменить его своим клоном.
Плюс, если кто-то еще вытащил из репо с плохими наборами изменений, он должен удалить и повторно клонировать (в противном случае плохие наборы изменений снова окажутся в центральном репо, как только кто-то другой подтолкнет снова).
Так что от обстоятельств зависит, подойдет ли вам это решение ...

9

вы можете либо отменить каждое отдельное изменение (в обратном порядке), либо, если их много, сделать это с одним большим обратным патчем.

Если у вас есть хорошие наборы изменений поверх тех, которые необходимо отменить, лучше зафиксируйте обратный патч поверх самого последнего плохого набора изменений, а затем перенесите их на кончик ветви.

1 -- 2 -- A -- B -- C -- 3 -- 4
                     \
                      C'B'A'

$ hg up C
$ hg diff -r C:2 > backout.diff
$ hg import --no-commit backout.diff
$ hg ci -m "Backout A, B, C"
$ hg up 4
$ hg rebase -s C'B'A -d .

There will be problems if you want to back out merge changesets, увидетьэта вики-страница для дополнительной информации.

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

Error: User Rate Limit Exceededhg diff -r "100:90" -I src/subdirError: User Rate Limit Exceeded-IError: User Rate Limit Exceeded-XError: User Rate Limit Exceeded
Error: User Rate Limit Exceededstackoverflow.com/questions/5435567/…Error: User Rate Limit Exceededhg diff -r 'keyword(xyz)'Error: User Rate Limit Exceeded Joshua Goldberg

Похожие вопросы