@Omnifarious: я зафиксировал стабильную версию файла. Затем продолжил работу над файлом, но вскоре понял, что мне нужна последняя «хорошая» версия. Это можно сделать с помощью обновления в svn, но когда я пытаюсь выполнить hg update,
появляется сообщение
Ответы:
153
Я думаю, вы хотите hg revert -r<rev> <file>(это изменит этот файл таким, каким он был в данной ревизии).
или просто hg revert <filename>, если вы хотите отменить текущие изменения и получить последнее, что было
зафиксировано
@BlackTigerX Без ревизии неизмененный файл не будет ни к чему возвращен, даже если это не самая последняя зафиксированная версия. Я иногда использую это, чтобы «выбирать» файлы между ревизиями, так что это важно.
user2864740
83
Как сказал djc, revertизменяет файл на месте, чтобы он соответствовал предыдущей версии. Если вы хотите, чтобы его не было, вы можете использовать hg cat -r revisionid filename(заменив, конечно, revisionid и filename), который выведет файл на стандартный вывод, подходящий для перенаправления в любое место, куда вы хотите.
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, а не строго линейную последовательность.
Ответы:
Я думаю, вы хотите
hg revert -r<rev> <file>
(это изменит этот файл таким, каким он был в данной ревизии).источник
Как сказал djc,
revert
изменяет файл на месте, чтобы он соответствовал предыдущей версии. Если вы хотите, чтобы его не было, вы можете использоватьhg cat -r revisionid filename
(заменив, конечно, revisionid и filename), который выведет файл на стандартный вывод, подходящий для перенаправления в любое место, куда вы хотите.источник
hg revert
действительно решает эту проблему. Но я думаю, что вас смущает более широкий круг вещей, чем просто ответ на ваш вопрос, и вы хотите попытаться ответить более полно.hg update
является командой всего репозитория и не будет работать с отдельными файлами. Это не похоже на подрывную деятельностьsvn update
. Если вы это сделаете,hg --help update
вы увидите, что это так, потому что команда не принимает аргумент файла. Его можно использовать для перемещения всего репозитория в конкретный моментальный снимок, но нельзя использовать для этого только в один файл.Если вы введете,
hg --help
вы увидите список команд. Это довольно большой и несколько устрашающий список, но если вы его прочитаете, вы найдете такую строку:Теперь, если вам просто нужно последнее состояние для сравнения, есть еще одна команда, которая может вас заинтересовать, и это
hg cat
. Это позволит вам распечатать содержимое файла любой конкретной ревизии. Затем вы можете перенаправить его вывод в другой файл. Затем вы можете сравнить предыдущую, заведомо исправную версию файла и старую версию для параллельного сравнения.Причина, по которой Mercurial имеет отдельную
update
команду, заключается в том, что в Mercurial можно делать что-то, что невозможно в Subversion. Вы можетеupdate
перейти к более ранней версии, внести изменения, а затем зафиксировать. Это создаст ветку. Командаupdate
также изменяет родительскую ревизию текущего рабочего каталога, а также изменяет содержимое всех файлов в этом каталоге на версии этой родительской ревизии.Это означает, что
revert
изменяется содержимое файла (или даже всего репозитория, если вы даете команде правильные аргументы), но оставляет родительскую версию текущей рабочей копии такой же.Вы можете узнать родительскую ревизию (или ревизии в случае слияния) текущей рабочей копии с помощью
hg parents
команды.В Subversion ревизии представляют собой строго линейное развитие. Mercurial создает ветки в мгновение ока, и их почти так же легко объединить. Изменения образуют группу DAG, а не строго линейную последовательность.
источник
Чтобы извлечь конкретную версию определенного файла, вы можете сделать это в Windows:
Здесь 9 - номер версии.
Или даже лучше:
источник
Пришел сюда, пытаясь получить предыдущую версию, поэтому вот точная команда:
источник