Лучший способ вернуться к предыдущей версии SVN файла? - PullRequest
167 голосов
/ 06 декабря 2008

Я случайно отправил слишком много файлов в репозиторий 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. Обратное слияние делает эту задачу не легче (насколько я могу судить), чем шаги, которые я описал выше.

Ответы [ 9 ]

243 голосов
/ 06 декабря 2008
svn merge -r 854:853 l3toks.dtx

или

svn merge -c -854 l3toks.dtx

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

35 голосов
/ 06 декабря 2008

Ознакомьтесь с разделом " отмена изменений " svn book

32 голосов
/ 25 ноября 2010

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

Допустим, я обновил локальные файлы до последней ревизии, которая составляет 854. Затем я хотел бы получить более старую ревизию - версию файла с несколькими ревизиями ранее, скажем, ревизию 851.

Копирование будет работать:

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

.. однако, я не могу быть обеспокоен поиском 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 - Джейкоб Райт - Flex, AIR, PHP и т. Д.

РЕДАКТИРОВАТЬ: ... и, очевидно, тот же эффект, что и svn merge -r HEAD:851 l3toks.dtx, может быть достигнут с помощью:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.
10 голосов
/ 12 июля 2012

Мне недавно пришлось вернуться к определенной ревизии, чтобы отладить старую сборку, и это работало как по волшебству:

svn up -r 3340 (or what ever your desired revision number)

Мне пришлось разрешать все конфликты, используя опцию "tc", так как я не заботился о локальных изменениях (проверил все, о чем заботился до возврата)

Чтобы вернуться к голове, пересмотр тоже был прост:

svn up
5 голосов
/ 06 декабря 2008

То, что вы ищете, называется «обратным слиянием». Вы должны проконсультироваться с документами о функции слияния в книге SVN (как указывает Луапяд, или, точнее, первый комментатор на этом посту). Если вы используете Черепаху, вы также можете просто перейти в представление журнала и щелкнуть правой кнопкой мыши и выбрать «отменить изменения из этой ревизии» на той, где вы допустили ошибку.

4 голосов
/ 11 марта 2014

svn merge объединит ревизии, а не отменит их. то есть, если у вас есть какое-то дополнение в вашей версии HEAD, то объедините его с предыдущей версией, тогда изменение сохранится.

Я использую svn cat и перенаправляю его в файл:

svn cat -r 851 l3toks.dtx > l3toks.dtx

Тогда у вас есть содержимое 851 в этом файле, и вы можете вернуть его обратно.

4 голосов
/ 09 января 2013

Если вы хотите отменить только последнюю регистрацию, вы можете использовать следующее

svn merge -r head:prev l3toks.dtx

Таким образом, вам не нужно искать номера текущей и предыдущей версий.

4 голосов
/ 06 декабря 2008

Обратное слияние - это именно то, что вам нужно (см. Ответ Луапьяда). Просто примените слияние к ошибочно принятому файлу, а не ко всему каталогу.

3 голосов
/ 12 февраля 2013

Если вы используете Eclipse IDE с плагином SVN , вы можете сделать следующее:

  1. Щелкните правой кнопкой мыши файлы, которые вы хотите вернуть (или папку, в которой они содержались, если вы удалили их по ошибке и хотите добавить их обратно)
  2. Выберите « Команда> Переключатель »
  3. Выберите радиионную кнопку «Редакция» и введите номер редакции, к которой вы хотите вернуться. Нажмите ОК
  4. Перейти к перспективе синхронизации
  5. Выберите все файлы, которые вы хотите восстановить
  6. Щелкните правой кнопкой мыши на выделении и выполните " Переопределить и зафиксировать ... "

Это вернет файлы к нужной вам ревизии. Просто помните, что SVN увидит изменения как новый коммит. То есть изменение получает новый номер ревизии, и между старой ревизией и новой нет никакой связи. В комментариях к фиксации следует указать, что вы возвращаете эти файлы к определенной ревизии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...