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

167

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

Ответы:

243
svn merge -r 854:853 l3toks.dtx

или

svn merge -c -854 l3toks.dtx

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

orip
источник
5
Спасибо за это, просто хотел что-то заявить - скажем, я на ревизии 855, я хочу вернуть файл к ревизии 854. Если я делаю svn merge -c -854 my.file, а затем делаю svn diff, то, кажется, показывает одну ревизию до 854 (то есть 853 ); только когда я делаю svm merge -c 854 myfile(без -), похоже, что myfile возвращается к rev 854. Еще раз спасибо, ура!
Сдау
11
Есть ли причина, по которой первый вариант, описанный выше, сработал для меня, а второй не работал вообще?
skybondsor
7
Не забудьте зафиксировать после обратного слияния. Я часто забываю :)
Vineeth Pradhan
11
Действительно, должно быть минус 1, чтобы не указывать разницу между этими двумя командами. Плохой ответ
Злой Дан
4
@ Sprog - если есть разница, я бы хотел знать
orip
34

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

luapyad
источник
5
Ссылки на внешние ресурсы приветствуются, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели представление о том, что это такое и почему оно есть. Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно недоступен.
user2084795
32

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

Допустим, я обновил локальные файлы до последней ревизии, которой является 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.
sdaau
источник
2
Вы должны ВСЕГДА предпочитать экспорт SVN, поскольку он делает именно то, что вы хотите - проверить файл в определенной ревизии, в то время как обратное объединение также попытается объединить ваши локальные изменения с указанной версией, это сложная и сумасшедшая операция, которая склонны к ошибкам, если вы не остерегаетесь!
Falco
1
У меня были проблемы с обратным слиянием. Вместо того, чтобы выяснить, почему, я просто попытался экспортировать, и он работал отлично. Я очень рекомендую просто использовать экспорт. Вы можете использовать --forceдля перезаписи каталогов. Просто помните, что все изменения будут перезаписаны.
Ник
Очень хорошее объяснение о том, что на самом деле происходит! Я часто использую AnkhSVN и TortoiseSVN, и я не вижу где-либо использовать svn export- я что-то упустил или это просто не реализовано в этих графических интерфейсах?
Конрад
@Conrad, Вы используете это, нажимая «Экспорт ...» в AnkhSVN и «Экспорт» в TortoiseSVN из контекстного меню вашего хранилища (щелчок правой кнопкой мыши)
nitinr708
10

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

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

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

Вернуть к ревизии тоже было просто:

svn up
Игорь
источник
5

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

rmeador
источник
4

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

Том
источник
4

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

svn merge -r head:prev l3toks.dtx

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

Кен Рассел
источник
4

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

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

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

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

Dylan
источник
3

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

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

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

ceiroa
источник