Ответ 1
svn merge -r 854:853 l3toks.dtx
или
svn merge -c -854 l3toks.dtx
Две команды эквивалентны.
Я случайно передал слишком много файлов в репозиторий SVN и изменил некоторые вещи, на которые я не хотел. (Вздох.) Чтобы вернуть их в прежнее состояние, лучшее, что я мог придумать, было
svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx
Jeez! Нет ли лучшего способа? Почему я не могу просто написать что-то вроде этого:
svn revert -r 854 l3toks.dtx
Хорошо, я использую только v1.4.4, но я просмотрел список изменений для ветки 1.5, и я не мог видеть ничего, непосредственно связанного с этим. Я что-то пропустил?
Изменить: Я думаю, я был недостаточно ясен. Я не думаю, что хочу свернуть слияние, потому что тогда я потеряю те изменения, которые я хочу сделать! Скажем, что fileA
и fileB
были изменены, но я хотел только зафиксировать fileA
; случайно набрав
svn commit -m "small change"
фиксирует оба файла, и теперь я хочу откат fileB
. Обратное слияние делает эту задачу не проще (насколько я могу судить), чем шаги, описанные выше.
svn merge -r 854:853 l3toks.dtx
или
svn merge -c -854 l3toks.dtx
Две команды эквивалентны.
Отъезд undoing changes "в разделе svn book
Извините, что вы использовали некоторое пространство только для повторения ранее заданного ответа - но это то, с чем я всегда сталкиваюсь.
Скажем, я обновил локальные файлы до последней версии, то есть 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 .
или подобное...
Ура!
Ссылка: Как отменить изменения с помощью 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", поскольку меня не интересовали локальные изменения (проверено во всем, о чем я заботился до возврата)
Чтобы вернуться к пересмотру главы, было просто:
svn up
То, что вы ищете, называется "обратным слиянием". Вы должны проконсультироваться с документами относительно функции слияния в книге SVN (как указывает luapyad, или, точнее, первый комментатор на этом посту). Если вы используете Tortoise, вы также можете просто войти в просмотр журнала и щелкнуть правой кнопкой мыши и выбрать "вернуть изменения из этой версии" на том, где вы допустили ошибку.
Обратное слияние - это именно то, что вы хотите (см. ответ luapyad). Просто примените слияние к ошибочно-скопированному файлу, а не ко всему каталогу.
Если вы хотите только отменить последний checkin, вы можете использовать следующие
svn merge -r head:prev l3toks.dtx
Таким образом, вам не нужно искать текущие и предыдущие номера версий.
svn merge объединит ревизии, а не вернет их. т.е. если у вас есть добавление в вашей версии HEAD, то слияние с предыдущей версией, то изменение будет сохраняться.
Я использую svn cat, а затем перенаправляю его в файл:
svn cat -r 851 l3toks.dtx > l3toks.dtx
Затем у вас есть 851 контент в этом файле и можно проверить его обратно.
Если вы используете Eclipse IDE с плагином SVN, вы можете сделать следующее:
Это вернет файлы к требуемой ревизии. Просто имейте в виду, что SVN увидит изменения как новые фиксации. То есть, изменение получает новый номер версии, и нет никакой связи между старой версией и новой. Вы должны указать в комментариях фиксации, что вы возвращаете эти файлы к определенной ревизии.