Как получить конкретную версию файла в Mercurial?

114

Я новичок в Mercurial. Просто не могу найти нужную команду. Пробовал обновить / оформить заказ безуспешно. Я использую локальный репозиторий. Спасибо

Кодизм
источник
@Omnifarious: я зафиксировал стабильную версию файла. Затем продолжил работу над файлом, но вскоре понял, что мне нужна последняя «хорошая» версия. Это можно сделать с помощью обновления в svn, но когда я пытаюсь выполнить hg update,
появляется сообщение

Ответы:

153

Я думаю, вы хотите hg revert -r<rev> <file>(это изменит этот файл таким, каким он был в данной ревизии).

DJC
источник
Ага, именно этого он и хочет. :-)
Omnifarious
9
или просто hg revert <filename>, если вы хотите отменить текущие изменения и получить последнее, что было
зафиксировано
@BlackTigerX Без ревизии неизмененный файл не будет ни к чему возвращен, даже если это не самая последняя зафиксированная версия. Я иногда использую это, чтобы «выбирать» файлы между ревизиями, так что это важно.
user2864740
83

Как сказал djc, revertизменяет файл на месте, чтобы он соответствовал предыдущей версии. Если вы хотите, чтобы его не было, вы можете использовать hg cat -r revisionid filename(заменив, конечно, revisionid и filename), который выведет файл на стандартный вывод, подходящий для перенаправления в любое место, куда вы хотите.

Ry4an Brase
источник
4
мурлыканье, именно то, что я хотел.
yota
Здорово, всегда приятно слышать что-то подобное.
Ry4an Brase
24

hg revertдействительно решает эту проблему. Но я думаю, что вас смущает более широкий круг вещей, чем просто ответ на ваш вопрос, и вы хотите попытаться ответить более полно.

hg updateявляется командой всего репозитория и не будет работать с отдельными файлами. Это не похоже на подрывную деятельность svn update. Если вы это сделаете, hg --help updateвы увидите, что это так, потому что команда не принимает аргумент файла. Его можно использовать для перемещения всего репозитория в конкретный моментальный снимок, но нельзя использовать для этого только в один файл.

Если вы введете, hg --helpвы увидите список команд. Это довольно большой и несколько устрашающий список, но если вы его прочитаете, вы найдете такую ​​строку:

revert       restore individual files or directories to an earlier state

Теперь, если вам просто нужно последнее состояние для сравнения, есть еще одна команда, которая может вас заинтересовать, и это hg cat. Это позволит вам распечатать содержимое файла любой конкретной ревизии. Затем вы можете перенаправить его вывод в другой файл. Затем вы можете сравнить предыдущую, заведомо исправную версию файла и старую версию для параллельного сравнения.

Причина, по которой Mercurial имеет отдельную updateкоманду, заключается в том, что в Mercurial можно делать что-то, что невозможно в Subversion. Вы можете updateперейти к более ранней версии, внести изменения, а затем зафиксировать. Это создаст ветку. Команда updateтакже изменяет родительскую ревизию текущего рабочего каталога, а также изменяет содержимое всех файлов в этом каталоге на версии этой родительской ревизии.

Это означает, что revertизменяется содержимое файла (или даже всего репозитория, если вы даете команде правильные аргументы), но оставляет родительскую версию текущей рабочей копии такой же.

Вы можете узнать родительскую ревизию (или ревизии в случае слияния) текущей рабочей копии с помощью hg parentsкоманды.

В Subversion ревизии представляют собой строго линейное развитие. Mercurial создает ветки в мгновение ока, и их почти так же легко объединить. Изменения образуют группу DAG, а не строго линейную последовательность.

Всевозможный
источник
13

Чтобы извлечь конкретную версию определенного файла, вы можете сделать это в Windows:

hg cat "<FileToBeExtractedPath>" -r 9 > "<ExtractionPath>"

Здесь 9 - номер версии.

Или даже лучше:

hg cat "<FileToBeExtractedPath>" -r 9 -o "<ExtractionPath>"
user2173353
источник
1

Пришел сюда, пытаясь получить предыдущую версию, поэтому вот точная команда:

hg revert -r .~1 <file>
cmcginty
источник