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


486

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

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

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

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

Ответы:


783

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

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

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


3
но слияние не отменяет мои изменения и новую ревизию.
Чен Кинрот

76
Если вы используете TortoiseSVN, щелкните правой кнопкой мыши файл, выберите «Объединить», затем «Объединить диапазон ревизий». В поле журнала введите 140-150 и установите флажок Обратный. После этого совершайте как обычно. Это выполнит ту же операцию, что и пример Джона.
DavGarcia

8
С помощью eclipse и subclipse, вы можете щелкнуть правой кнопкой мыши по вашему проекту, Team / Show History, затем выбрать, затем ревизии, которые вы хотите «отменить», а другим щелчком правой кнопкой мыши выбрать «Вернуть изменения из выбранных ревизий».
Фего

36
Чтобы вернуться из головы ревизии вы также можете написать svn merge -r HEAD:140.
sschmeck

3
Инструкции TortoiseSVN от DavGarcia были для меня неправильными, по крайней мере, не возвращать все файлы в ревизии (используя TortoiseSVN 1.8.8). Щелкните правой кнопкой мыши по папке, выберите TortoisSVN-> Показать журнал. Выберите ревизию (и), которую вы хотите отменить, щелкните правой кнопкой мыши, как сказать «Отменить изменения из этой ревизии». Зафиксируйте изменения.
mhenry1384

178

Вы можете совершить только новые изменения на голове истории подрывной деятельности.

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

Найти хороший номер ревизии и вернуться

  1. Найдите номер ревизии старой копии, которую вы хотите.

    Получите текущую версию с:

    svn info --show-item revision
    # or
    svn log

    Или, чтобы проверить более старые версии вашего проекта, используйте:

    svn update -r <earlier_revision_number>

    пока вы не найдете правильный номер ревизии.

  2. Запишите правильный номер ревизии (предположим, 123для примеров ниже).

  3. Обновление до последней версии:

    svn update
  4. Отмените все изменения между нужной ревизией и последней версией:

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"

    (так же, как ответ Джона Скита выше.)

Если вы не можете найти номер ревизии

Если вы не можете найти старую копию и просто хотите зафиксировать файлы, которые в данный момент находятся на вашем ПК:

  1. Сделайте копию своей хорошей версии (но без каких-либо .svnпапок):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
  2. Теперь убедитесь, что у вас последняя версия:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
  3. Скопируйте свою хорошую версию поверх рабочей копии.

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

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/

    Если у вас нет rsync, вы можете использовать, cp -aно вам также нужно будет удалить все ненужные файлы вручную.

  4. Вы должны быть в состоянии совершить то, что у вас есть сейчас.

    cd project
    svn commit "Reverted to good copy"

2
SVN не интерпретирует это как модификацию, я не могу это сделать.
Сандбург

svn merge -r ГОЛОВА: 12345. правильная команда для возврата, не делать обновление -r. Вы сумасшедший человек.
Сова

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

36

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

svn update -r yourOldRevesion

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

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


15
Это не решает проблему. Вместо этого это создает состояние, в котором спрашивающий находился во время задания своего вопроса.
Инго Шальк-Шупп

1
Если вам не повезло следовать этому совету, запустите: «svn resolv --accept working -R».
Сова

27

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

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

    svn export http: // url-to-your-file @ 123 / tmp / filename

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


Используя Tortoise-svn, я могу щелкнуть правой кнопкой мыши по одному файлу и объединить его. Должен быть способ сделать это с помощью svn?
жк.

10
svn cat -r 123 path-in-your-working-copy > path-in-your-working-copy
dash17291


5

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

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

Например:

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

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


3

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

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

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

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

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


2

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


2

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

Я случайно изменил файл с окончанием строки 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"

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


1

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

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


1

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

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

svn merge -r HEAD:12345 .

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


0

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

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


0

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

Cherry-Pick Merge

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

  1. Эта форма называется 'вишневым' слиянием: '-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 с сервера. Изменение происходит локально, что означает, что если у вас есть чистая проверка, то изменения могут быть проверены перед их фиксацией.


-1

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

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

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.