Кращий спосіб повернутися до попередньої версії файлу SVN?


167

Я випадково зафіксував занадто багато файлів у сховищі 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. Зворотне злиття робить це завдання не простішим (наскільки я можу сказати), ніж описані вище кроки.


Відповіді:


243
svn merge -r 854:853 l3toks.dtx

або

svn merge -c -854 l3toks.dtx

Дві команди рівнозначні .


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

11
Чи є причина, чому перший варіант вище працював як шарм для мене, а другий не працював НА ВСІХ?
skybondsor

7
Не забудьте зробити фіксацію після зворотного злиття. Я часто забуваю :)
Vineeth Pradhan

11
Дійсно, слід мінус 1, щоб не вказати, в чому різниця між цими двома командами. Погана відповідь
Сердитий Ден

4
@sprog - якщо є різниця, я буду вдячний знати
відкрийте

34

Перегляньте розділ " Скасування змін " книги svn


5
Посилання на зовнішні ресурси рекомендуються, але, будь ласка, додайте контекст навколо посилання, щоб ваші колеги користувачі мали уявлення про те, що це таке і чому воно існує. Завжди цитуйте найбільш релевантну частину важливого посилання на випадок, якщо цільовий сайт недоступний або перебуває постійно в режимі офлайн.
користувач2084795

32

Вибачте, що використовуєте простір лише на повторення раніше даної відповіді - але це те, що я завжди стикаюся з проблемою.

Скажімо, я оновив локальні файли до останньої версії, яка становить 854. Потім я хотів би отримати старішу версію - версію файлу з декількох версій раніше, скажімо, версію 851.

Копія спрацює:

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

.. однак, я не можу перейматися привітанням за URL-адресу репо :)

Оновлення, здавалося б, може спрацювати:

svn up -r 851 ./l3toks.dtx

... однак, він також позначає локальну копію як "щойно перевірену", а точніше - "таку ж, як і онлайн-ревізія" (тобто у Tortoise / RabbitVCS ви отримуєте зелену галочку OK) - це означає, що ви не можете цього зробити 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для швидкого переконання, чи вдалося повернути правильну версію локально; а також файл буде позначений червоним знаком оклику в черепаха / RabbitVCS (тобто, відрізняється від останньої введеної версії), і тому svn ci -m "rolled back to r 851"може запускатися цього разу.

Також зауважте, що якщо ви, нарешті, передумаєте після зворотного злиття ( тобто ви все одно хочете продовжувати працювати над останньою редакцією HEAD, тут 854 - після того, як ви повернулися до 851 локально, але ще не здійснили відкат. ), ви не повинні використовувати svn up, тому що це просто скаже, що це вже " У редакції 854 "; використовувати замість цього svn revert --recursive .чи подібне ...

Ура!

Ref: Як повернути зміни за допомогою Subversion - Jacob Wright - Flex, AIR, PHP тощо.

EDIT: ... і, мабуть, точно такий же ефект, як і svn merge -r HEAD:851 l3toks.dtx, можна досягти за допомогою:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.

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 (як вказує luapyad, а точніше перший коментатор на цій публікації). Якщо ви використовуєте Tortoise, ви також можете просто перейти до подання журналу та клацнути правою кнопкою миші та вибрати "скасувати зміни з цієї версії" на тому, де ви допустили помилку.


4

Зворотне злиття - це саме те, що ви хочете (див. Відповідь луапяди). Просто застосуйте злиття до помилково зафіксованого файлу замість всього каталогу.


4

Якщо ви хочете скасувати лише останню реєстрацію, ви можете скористатися наступною

svn merge -r head:prev l3toks.dtx

Таким чином, вам не доведеться полювати за поточними та попередніми номерами версій.


4

svn merge злиє версії, а не поверне їх. тобто якщо у вашій версії HEAD є якесь доповнення, то з’єднайте його з попередньою редакцією, то зміна збережеться.

Я використовую svn cat, а потім переадресовую її у файл:

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

Тоді у вас є 851 вміст у цьому файлі і ви можете його перевірити ще раз.


3

Якщо ви використовуєте ID Eclipse з плагіном SVN, ви можете зробити наступне:

  1. Клацніть правою кнопкою миші файли, які ви хочете відновити (або папку, в якій вони були, якщо ви видалили їх помилково і хочете додати їх назад)
  2. Виберіть " Команда> Перемикач "
  3. Виберіть радіо кнопку "Перегляд" та введіть номер редакції, на який ви хочете повернутися. Натисніть кнопку ОК
  4. Перейдіть до точки зору синхронізації
  5. Виберіть усі файли, які потрібно відновити
  6. Клацніть правою кнопкою миші на виділеному елементі та зробіть " Переокремити та вкласти ... "

Це поверне файли до потрібної редакції. Пам’ятайте лише, що SVN побачить зміни як нове зобов’язання. Тобто зміна отримує новий номер редакції, і між старою редакцією та новою не існує зв’язку. У коментарях до комісій слід вказати, що ви повертаєте ці файли до певної редакції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.