Лучший способ вернуться к предыдущей версии 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 ответов
Извините, что потратил немного места на повторение ранее данного ответа - но это то, с чем я всегда сталкиваюсь.
Допустим, я обновил локальные файлы до последней ревизии, которой является 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, вы можете сделать следующее:
- Щелкните правой кнопкой мыши файлы, которые вы хотите восстановить (или папку, в которой они содержались, если вы удалили их по ошибке и хотите добавить их обратно)
- Выберите "Команда> Переключить"
- Выберите кнопку "Revision" и введите номер ревизии, к которой вы хотите вернуться. Нажмите ОК
- Перейти к перспективе Синхронизировать
- Выберите все файлы, которые вы хотите восстановить
- Щелкните правой кнопкой мыши на выделении и выполните "Переопределить и зафиксировать..."
Это вернет файлы к ревизии, которую вы хотите. Просто помните, что SVN увидит изменения как новый коммит. То есть изменение получает новый номер ревизии, и между старой ревизией и новой нет никакой связи. В комментариях к коммиту следует указать, что вы возвращаете эти файлы к определенной ревизии.