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


Обновлено: я думаю, я не был достаточно ясным. Я не думаю, что хочу отменить слияние, потому что тогда я потеряю изменения, которые хочу внести сделал! Скажем, что и fileA, и fileB были изменены, но я хотел только зафиксировать fileA; случайно набрав

svn commit -m "small change"

фиксирует оба файла, и теперь я хочу откатить fileB. Обратное слияние делает эту задачу не проще (насколько я могу судить), чем шаги, которые я описал выше.

Возможный дубликат Как мне отменить фиксацию SVN?

Vadzim 29.11.2016 17:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
167
1
274 465
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

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

user2084795 24.06.2015 12:50

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

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

Ответ принят как подходящий
svn merge -r 854:853 l3toks.dtx

или же

svn merge -c -854 l3toks.dtx

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

Ах, наконец, я вижу соответствующую часть в svn help merge (использование №3). Спасибо!

Will Robertson 06.12.2008 18:39

Спасибо за это, просто хотел кое-что сказать - скажем, у меня ревизия 855, я хочу вернуть файл к ревизии 854. Если я сделаю svn merge -c -854 my.file, а затем сделаю svn diff, он, похоже, покажет одну ревизию до 854 (то есть , 853); только когда я использую svm merge -c 854 myfile (без -), похоже, что мой файл вернулся к версии 854. Еще раз спасибо, ура!

sdaau 07.11.2010 17:09

Есть ли причина, по которой первый вариант выше работал для меня как шарм, а второй не работал ВООБЩЕ?

skybondsor 15.03.2011 18:38

Однако не забудьте сделать коммит после обратного слияния. Я часто забываю :)

Vineeth Pradhan 15.12.2011 16:25

На самом деле следует минус 1, чтобы не указать, в чем разница между этими двумя командами. Плохой ответ

Angry Dan 17.07.2012 18:52

@sprog - если есть разница, я был бы признателен за информацию

orip 17.07.2012 22:12

Если вы просто отменяете последнюю фиксацию файла, по сравнению с вашей версией WC, svn merge -r BASE:PREV filename должен работать, верно?

svidgen 28.02.2013 20:06

@orip из svn help merge: "'-c M' эквивалентно '-r <M-1>: M', а '-c -M' делает обратное: '-r M: <M-1>'."

ErichBSchulz 21.05.2013 07:24

@ErichBSchulz, это правильно, поэтому эти две команды эквивалентны.

orip 21.05.2013 07:50

@skybondsor может ты забыл тире в "-854"? Только что случилось со мной

Camilo Díaz Repka 28.06.2013 17:24

@skybondsor - а почему вы не довольны, когда работает любой вариант? Чтобы ответить на ваш вопрос: возможно, вам пора обновить клиент svn. merge -c был не всегда.

Tomasz Gandor 23.11.2013 09:42

перед фиксацией изменений вы можете проверить, похож ли файл на нужную ревизию, поэтому используйте svn diff -r <version_number> <file>

msonsona 20.05.2014 13:13

Первая строка (svn merge -r 854: 853 l3toks.dtx) откатится до v853, я вижу результат после svn status и могу svn commit, а вторая нет (я ничего не вижу после svn status, но файл был откатил) так они не одинаковые, svn v1.6.11

CodyChan 21.05.2015 05:09

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

Скажем, я обновил локальные файлы до последней версии, которой является 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": просто потому, что исполняемый файл local 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, поскольку он делает именно то, что вы хотите - проверьте файл в определенной ревизии, в то время как обратное слияние также попытается объединить ваши локальные изменения с указанной версией, это сложная и безумная операция, которая является подвержены ошибкам, если вы не будете осторожны!

Falco 19.03.2014 15:57

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

Nick 27.01.2015 23:25

Очень хорошее объяснение того, что на самом деле происходит! Я часто использую AnkhSVN и TortoiseSVN, и я не вижу нигде, где можно было бы использовать svn export - мне что-то не хватает или это просто не реализовано в этих графических интерфейсах?

Conrad 17.03.2016 19:10

@Conrad, вы используете это, щелкнув «Экспорт ...» в AnkhSVN и «Экспорт» в TortoiseSVN из контекстного меню репозитория (щелчок правой кнопкой мыши)

nitinr708 01.08.2017 12:16

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

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

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

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

svn up

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

svn merge -r head:prev l3toks.dtx

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

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

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

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

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

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

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

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

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