Лучший способ вернуться к предыдущей версии SVN файла?
я случайно зафиксировал слишком много файлов в репозитории SVN и изменил некоторые вещи, которые я не хотел. (Вздыхать.) Чтобы вернуть их в прежнее состояние, лучшее, что я мог придумать, было
svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx
Господи! Нет ли лучшего способа? Почему я не могу просто написать что-то вроде этого:
svn revert -r 854 l3toks.dtx
хорошо, я использую только v1.4.4, но я просмотрел список изменений для ветки 1.5, и я не видел ничего, непосредственно связанного с этим. Я пропустила ничего?
Edit: я думаю, я был недостаточно ясен. Я не думаю, что хочу отменить слияние, потому что тогда я потеряю изменения, которые я сделал хочу сделать! Скажи это fileA
и fileB
были изменены, но я только хотел совершить fileA
; случайно введя
svn commit -m "small change"
фиксирует оба файла, и теперь я хочу откатить fileB
. Обратное слияние делает эту задачу не проще (насколько я могу судить), чем описанные выше шаги.
9 ответов
извините, что использую некоторое пространство только для повторения ранее данного ответа - но это то, с чем я всегда в конечном итоге в беде.
предположим, я обновил локальные файлы до последней версии, которая составляет 854. Затем я хотел бы получить более старую версию - версию файла из нескольких версий ранее, скажем, версии 851.
копия будет работать:
svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx
.. однако я не могу беспокоиться о grepping для URL-адреса РЕПО :)
обновление, по-видимому, может работать:
svn up -r 851 ./l3toks.dtx
... однако он также помечает локальную копию как "недавно проверенную" или, скорее, "такую же, как онлайн - версия" (т. е. в Tortoise/RabbitVCS вы получаете зеленую галочку OK) - что означает, что вы не можете сделать svn ci -m "rolled back to r 851"
: просто потому, что местные subversion
исполняемый файл не заметит никаких локальных изменений и не будет беспокоиться о загрузке чего-либо в онлайн-репозиторий.
и, как уже ответили, обратное слияние работает - но в в этом случае не следует полагаться на синтаксис ярлыка; но, в частности, состояние:
svn merge -r HEAD:851 l3toks.dtx
--- Reverse-merging r854 through r852 into 'l3toks.dtx':
U l3toks.dtx
должен признаться - я бы никогда не понял предложение"обратное слияние r854 через r852 в файл" как "только что получил r851 вашего файла и перезаписал все, что у вас было ранее локально, - и он отмечен как отличающийся от последней онлайн-версии, поэтому вы можете проверить его в интернете как новую версию "отката"", но я думаю (и надеюсь :) ) что есть, то делает :)
после этого, можно использовать svn diff
для быстрого убедитесь, что мы получили правильную ревизию обратно локально; а также, файл будет отмечен красным восклицательным знаком в Tortoise / RabbitVCS (то есть, отличается от последней зафиксированной версии), и так svn ci -m "rolled back to r 851"
может работать на этот раз.
также обратите внимание, что если Вы, наконец, передумаете после обратного слияния (т. е. вы в любом случае хотите продолжать работать над последней редакцией HEAD, здесь 854-после того, как у вас есть откат до 851 локально, но еще не совершил откат), вы не должны использовать svn up
, потому что он просто скажет, что он уже "в редакции 854"; вместо этого используйте svn revert --recursive .
или аналогичные...
Ура!
Ref:как откатить изменения с помощью Subversion-Jacob Wright-Flex, AIR, PHP и т. д.
EDIT: ... и, по-видимому, точно такой же эффект, как svn merge -r HEAD:851 l3toks.dtx
, может быть достигнуто с помощью:
svn export -r 851 l3toks.dtx
A l3toks.dtx
Export complete.
недавно мне пришлось вернуться к определенной ревизии для отладки старой сборки, и это сработало как магия:
svn up -r 3340 (or what ever your desired revision number)
мне пришлось разрешить все конфликты с помощью опции "tc", так как я не заботился о локальных изменениях (проверил все, что я заботился до возврата)
вернуться к редакции head тоже было просто:
svn up
то, что вы ищете, называется "обратное слияние". Вы должны проконсультироваться с документами относительно функции слияния в книге SVN (как указывает luapyad, или, точнее, первый комментатор на этом посту). Если вы используете Tortoise, вы также можете просто войти в представление журнала и щелкнуть правой кнопкой мыши и выбрать "отменить изменения из этой ревизии" на том, где вы сделали ошибку.
обратное слияние-это именно то, что вы хотите (см. ответ luapyad). Просто примените слияние к ошибочно введенному файлу вместо всего каталога.
Если вы хотите отменить только последнюю проверку, вы можете использовать следующее
svn merge -r head:prev l3toks.dtx
таким образом, вам не нужно искать текущие и предыдущие номера версий.
SVN merge объединит ревизии, а не отменит их. т. е. если у вас в голове версия, что после слияния с предыдущей версии, то изменение будет сохраняться.
Я использую svn cat, а затем перенаправляю его в файл:
svn cat -r 851 l3toks.dtx > l3toks.dtx
тогда у вас есть содержимое 851 в этом файле и вы можете проверить его обратно.
Если вы используете Eclipse IDE С SVN плагин вы можете сделать следующим образом:
- щелкните правой кнопкой мыши файлы, которые вы хотите вернуть (или папку, в которой они содержались, если вы удалили их по ошибке, и вы хотите добавить их обратно)
- выбираем "