Лучший способ вернуться к предыдущей версии SVN файла?

Я случайно отправил слишком много файлов в репозиторий 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 ответов

Решение
svn merge -r 854:853 l3toks.dtx

или же

svn merge -c -854 l3toks.dtx

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

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

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

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

Скопировать будет работать:

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

... однако, я не могу быть обеспокоен поиском URL репо:)

Обновление вроде бы может сработать:

svn up -r 851 ./l3toks.dtx

... однако, он также помечает локальную копию как "только что извлеченную" или, скорее, "такую ​​же, как онлайн-ревизия" (т.е. в Tortoise/RabbitVCS вы получаете зеленую галочку "ОК"), что означает, что вы не можете сделать 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.

Недавно мне пришлось вернуться к определенной ревизии для отладки старой сборки, и это работало как по волшебству:

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

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

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

svn up

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

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

svn merge -r head:prev l3toks.dtx

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

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

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

Я использую SVN Cat, а затем перенаправить его в файл:

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

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

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

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

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

Другие вопросы по тегам