Как получить конкретную версию файла в Mercurial? - PullRequest
105 голосов
/ 21 января 2010

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

Ответы [ 5 ]

145 голосов
/ 21 января 2010

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

80 голосов
/ 21 января 2010

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

23 голосов
/ 21 января 2010

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

hg update - это целая команда хранилища, которая не будет работать с отдельными файлами. Это не похоже на Subversion 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, а не строго линейную последовательность.

11 голосов
/ 15 ноября 2013

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

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

Здесь 9 - номер редакции.

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

hg cat "<FileToBeExtractedPath>" -r 9 -o "<ExtractionPath>"
1 голос
/ 18 сентября 2018

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

hg revert -r .~1 <file>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...