Лучший способ вернуться к предыдущей версии 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 ответов


svn merge -r 854:853 l3toks.dtx

или

svn merge -c -854 l3toks.dtx

две команды эквивалентно.


Проверьте "отмена изменений раздел" о svn книга


извините, что использую некоторое пространство только для повторения ранее данного ответа - но это то, с чем я всегда в конечном итоге в беде.

предположим, я обновил локальные файлы до последней версии, которая составляет 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 плагин вы можете сделать следующим образом:

  1. щелкните правой кнопкой мыши файлы, которые вы хотите вернуть (или папку, в которой они содержались, если вы удалили их по ошибке, и вы хотите добавить их обратно)
  2. выбираем "