Я случайно поместил слишком много файлов в репозиторий 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 книга
Ссылки на внешние ресурсы приветствуются, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши друзья-пользователи имели некоторое представление о том, что это такое и почему. Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно отключен.
То, что вы ищете, называется «обратным слиянием». Вы должны проконсультироваться с документами относительно функции слияния в книге SVN (как указывает luapyad, или, точнее, первый комментатор этого сообщения). Если вы используете Tortoise, вы также можете просто зайти в представление журнала, щелкнуть правой кнопкой мыши и выбрать «отменить изменения из этой ревизии» для той, в которой вы допустили ошибку.
Обратное слияние - это именно то, что вам нужно (см. Ответ luapyad). Просто примените слияние к ошибочно выполненному файлу, а не ко всему каталогу.
svn merge -r 854:853 l3toks.dtx
или же
svn merge -c -854 l3toks.dtx
Две команды эквивалентны.
Ах, наконец, я вижу соответствующую часть в svn help merge (использование №3). Спасибо!
Спасибо за это, просто хотел кое-что сказать - скажем, у меня ревизия 855, я хочу вернуть файл к ревизии 854. Если я сделаю svn merge -c -854 my.file, а затем сделаю svn diff, он, похоже, покажет одну ревизию до 854 (то есть , 853); только когда я использую svm merge -c 854 myfile (без -), похоже, что мой файл вернулся к версии 854. Еще раз спасибо, ура!
Есть ли причина, по которой первый вариант выше работал для меня как шарм, а второй не работал ВООБЩЕ?
Однако не забудьте сделать коммит после обратного слияния. Я часто забываю :)
На самом деле следует минус 1, чтобы не указать, в чем разница между этими двумя командами. Плохой ответ
@sprog - если есть разница, я был бы признателен за информацию
Если вы просто отменяете последнюю фиксацию файла, по сравнению с вашей версией WC, svn merge -r BASE:PREV filename должен работать, верно?
@orip из svn help merge: "'-c M' эквивалентно '-r <M-1>: M', а '-c -M' делает обратное: '-r M: <M-1>'."
@ErichBSchulz, это правильно, поэтому эти две команды эквивалентны.
@skybondsor может ты забыл тире в "-854"? Только что случилось со мной
@skybondsor - а почему вы не довольны, когда работает любой вариант? Чтобы ответить на ваш вопрос: возможно, вам пора обновить клиент svn. merge -c был не всегда.
перед фиксацией изменений вы можете проверить, похож ли файл на нужную ревизию, поэтому используйте svn diff -r <version_number> <file>
Первая строка (svn merge -r 854: 853 l3toks.dtx) откатится до v853, я вижу результат после svn status и могу svn commit, а вторая нет (я ничего не вижу после svn status, но файл был откатил) так они не одинаковые, svn v1.6.11
извините, что потратил немного места на повторение ранее данного ответа - но это то, с чем у меня всегда возникают проблемы.
Скажем, я обновил локальные файлы до последней версии, которой является 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, поскольку он делает именно то, что вы хотите - проверьте файл в определенной ревизии, в то время как обратное слияние также попытается объединить ваши локальные изменения с указанной версией, это сложная и безумная операция, которая является подвержены ошибкам, если вы не будете осторожны!
Возникли проблемы с обратным слиянием. Вместо того, чтобы выяснять почему, я просто попробовал экспорт, и он отлично сработал. Я очень рекомендую использовать только экспорт. Вы можете использовать --force для перезаписи каталогов. Просто помните, что он перезапишет любые изменения.
Очень хорошее объяснение того, что на самом деле происходит! Я часто использую AnkhSVN и TortoiseSVN, и я не вижу нигде, где можно было бы использовать svn export - мне что-то не хватает или это просто не реализовано в этих графических интерфейсах?
@Conrad, вы используете это, щелкнув «Экспорт ...» в AnkhSVN и «Экспорт» в TortoiseSVN из контекстного меню репозитория (щелчок правой кнопкой мыши)
Недавно мне пришлось вернуться к конкретной ревизии для отладки более старой сборки, и это сработало как по волшебству:
svn up -r 3340 (or what ever your desired revision number)
Мне пришлось разрешить все конфликты с помощью опции «tc», так как меня не волновали локальные изменения (проверял все, что меня волновало, до возврата)
Чтобы вернуться к голове, доработка тоже была простой:
svn up
Если вы хотите отменить только последнюю отметку, вы можете использовать следующие
svn merge -r head:prev l3toks.dtx
Таким образом, вам не придется искать текущие и предыдущие номера версий.
Если вы используете Eclipse IDE с Плагин SVN, вы можете сделать следующее:
Это вернет файлы к нужной вам ревизии. Просто имейте в виду, что SVN увидит изменения как новую фиксацию. То есть изменению присваивается новый номер ревизии, и нет связи между старой ревизией и новой. Вы должны указать в комментариях к фиксации, что вы возвращаете эти файлы к определенной ревизии.
svn merge объединит ревизии, а не откатит их. т.е. если у вас есть какое-то дополнение в вашей версии HEAD, объедините его с предыдущей ревизией, тогда изменение сохранится.
Я использую svn cat, а затем перенаправляю его в файл:
svn cat -r 851 l3toks.dtx > l3toks.dtx
Тогда у вас будет содержимое 851 в этом файле, и вы можете вернуть его обратно.
Возможный дубликат Как мне отменить фиксацию SVN?