Как мне вернуться к более старой версии нашего кода в Subversion?

Я работаю над проектом с другом и хочу вернуться к более старой версии нашего кода и установить его в качестве текущей. Как мне это сделать?

Я использую "anksvn" на vs08.

У меня есть версия, которую я хочу на моем ПК, но фиксация не удалась; Сообщение, которое я получаю: "Сбой при фиксации, файл или каталог устарел".

У меня также есть клиент Subversion на моем ПК.

13 ответов

Решение

По сути, вам нужно "объединить в обратном направлении" - применить разницу между текущей и предыдущей версией к текущей версии (чтобы вы получили рабочую копию, похожую на старую версию), а затем зафиксировать снова. Так, например, чтобы перейти от ревизии 150 (текущей) обратно к ревизии 140:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

В Красной книге Subversion есть хороший раздел об этом.

Причина, по которой вы ничего не можете сделать напрямую с хорошей копией, которую вы имеете на своем ПК, заключается в том, что ее папки.svn знают, что это код из прошлого, поэтому требует обновления. Но на самом деле вы можете совершать изменения только во главе истории подрывной деятельности.

Ты можешь использовать

svn update -r <earlier_revision_number>

проверять различные старые версии вашего проекта, пока вы не найдете правильный номер ревизии вашей хорошей версии. Когда вы найдете его, обновитесь до последней (головной) ревизии, затем примените svn merge, как предложено выше.

Если вы действительно не можете найти его и хотите зафиксировать копию на вашем ПК, тогда получите свежее обновление до последней версии и скопируйте поверх него "хорошую" версию (без папок.svn!). Удалите все файлы, которые не были в хорошем экземпляре, из папок и из Subversion, и зафиксируйте то, что у вас есть.

Просто используйте эту строку

svn update -r yourOldRevesion

Вы можете узнать свою текущую версию, используя:

свн информация

Стандартный способ использования слияния для отмены всей регистрации отлично работает, если это то, что вы хотите сделать. Иногда, однако, все, что вы хотите сделать, это вернуть один файл. Нет законного способа сделать это, но есть взлом:

  1. Найдите версию, которую вы хотите, используя svn log.
  2. Используйте подкоманду svn export:

    SVN-экспорт http://url-to-your-file@0.0.0.123/ / tmp / filename

(Где 123 - номер редакции для хорошей версии файла.) Затем переместите или скопируйте этот единственный файл, чтобы перезаписать старый. Проверьте в измененном файле, и все готово.

Немного больше старой школы

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

тогда обычный

svn diff
svn commit

Я думаю, что это наиболее подходит:

Выполните слияние в обратном направлении, например, если зафиксированный код содержит ревизию с версии 5612 до 5616, просто объедините ее в обратном направлении. Это работает в моем конце.

Например:

svn merge -r 5616:5612 https://<your_svn_repository>/

Он будет содержать объединенный код обратно в прежнюю ревизию, а затем вы сможете его зафиксировать.

Это то, что я сделал и работал для меня.

Я хочу отменить изменения в нескольких коммитах, которые я делал в определенные моменты времени, и хочу перейти к предыдущей точке фиксации.

  1. Перейти в команду -> Показать историю.
  2. Щелкните правой кнопкой мыши или диапазон ревизий, которые вы хотите игнорировать.
  3. Выберите опцию "Отменить изменения".

Это запустит обратное слияние, отменяя изменения в вашей рабочей копии.

Просто просмотрите код и подтвердите.

На этой странице много опасных ответов. Обратите внимание, что начиная с версии 1.6 SVN, обновление -r может вызвать конфликты деревьев, которые быстро перерастают в потенциально кошмарные потери данных, когда вы ищете информацию о конфликтах деревьев.

Правильный способ вернуться к версии:

svn merge -r HEAD:12345 .

Где 12345 - номер версии. Не забывайте точку.

Щелкните правой кнопкой мыши на самой высокой иерархии, которую вы хотите восстановить >> Revert или же Revert to Revision

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

Я случайно изменил файл с окончанием строки Unix на конец строки DOS при внесении небольшого изменения и зафиксировал его. Это легко отменить, либо изменив окончание строки и зафиксировав снова, либо с помощью обратного слияния, но это имеет эффект создания svn blame перечислите мое редактирование как источник каждой строки файла. (Интересно, что на TortoiseSVN в Windows это не влияет; только командная строка svn blame.)

Если вы хотите сохранить историю, как сообщается svn blameЯ думаю, вам нужно сделать следующее:

  • Удалить файл и зафиксировать.
  • В репозитории скопируйте предыдущую исправную копию файла в заголовок и подтвердите.
  • Восстановите любые изменения, которые вы хотите сохранить.

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

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

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

Щелкните правой кнопкой мыши проект> Заменить на> Ревизия или URL-адрес> Выберите конкретную ревизию, которую вы хотите отменить.

Теперь передайте локальную версию кода обновления в хранилище. Это вернет базу кода к определенной ревизии.

Ответ Джона Скита - в значительной степени решение в двух словах, однако, если вы похожи на меня, вам может потребоваться объяснение. Руководство Subversion называет это

Cherry-Pick Merge

Из справочных страниц.

  1. Эта форма называется слиянием 'cherry-pick': '-r N:M' относится к разнице в истории ветки источника между ревизиями N и M.

    "Обратный диапазон" может использоваться для отмены изменений. Например, когда источник и цель ссылаются на одну и ту же ветвь, ранее зафиксированная ревизия может быть отменена. В обратном диапазоне N больше, чем M в "-r N: M", или опция "-c" используется с отрицательным числом: "-c -M" эквивалентно "-r M:". Отмена таких изменений также называется выполнением "обратного слияния".


  • Если источником является файл, то к этому файлу применяются различия (полезно для обратного объединения более ранних изменений). В противном случае, если источником является каталог, то целью по умолчанию является ".".

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

Пример:

svn merge -r 2983:289 path/to/file

Это заменит локальную копию [2983] (которая, согласно приведенной выше цитате, должна синхронизироваться с сервером - ваша ответственность) ревизией 289 с сервера. Изменение происходит локально, что означает, что если у вас есть чистая проверка, то изменения могут быть проверены перед их фиксацией.

Синхронизируйте со старой версией и зафиксируйте ее. Это должно сделать свое дело.

Вот также объяснение отмены изменений.

Следующее сработало для меня.

У меня было много локальных изменений, и мне нужно было отменить их в локальной копии и получить последнюю стабильную версию в SVN.

  1. Проверьте состояние всех файлов, в том числе игнорируемых файлов.

  2. Grep все строки, чтобы получить недавно добавленные и проигнорированные файлы.

  3. Замените их на //,

  4. и rm -rf все строки.

    svn status --no-ignore | grep '^ [? I]' | sed "s / ^ [? I] //" | xargs -I {} rm -rf "{}"

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