Отмена изменений


Еще одним типичным применением для svn merge является откат изменений, которые уже были зафиксированы. Предположим вы спокойно работаете в рабочей копии /calc/trunk и выясняете, что изменения сделанные в правке 303, которые изменили integer.c, полностью ошибочны. Вы можете воспользоваться командой svn merge для «отмены» изменений в своей рабочей копии, после чего зафиксировать локальные изменения в хранилище. Все, что нужно сделать, это указать обратные отличия:

$ svn merge -r 303:302 http://svn.example.com/repos/calc/trunk U integer.c $ svn status M integer.c $ svn diff … # verify that the change is removed … $ svn commit -m "Undoing change committed in r303." Sending integer.c Transmitting file data . Committed revision 350.

Одним из взглядов на правку хранилища является представление ее в виде сгруппированных изменений (некоторые системы управления версиями называют это набором изменений). Используя параметр -r можно попросить svn merge применить к рабочей копии набор изменений или целый диапазон наборов изменений. В нашем случае с отменой изменений, мы просим svn merge применить к рабочей копии набор изменений #303 в обратном направлении.

Обратите внимание, что откат изменений подобным образом ничем не отличается от любых других операций, выполненных с помощью svn merge, поэтому необходимо использовать svn status и svn diff для того, что бы убедится, что ваша работа находится в том состоянии в котором вам нужно, а затем используя svn commit отправить финальную версию в хранилище. После фиксации, этот конкретный набор изменений больше не будет отражен в правке HEAD.

Но наряду с этим, вы можете подумать: однако же на самом деле фиксация не отменяется, не так ли? Изменения продолжают существовать в правке 303. И если кто-то создаст рабочую копию версии проекта calc между правками 303 и 349, он все равно получит ошибочные изменения, верно?

Да, это так. Когда мы говорим об «удалении» изменений, имеется в виду их удаление из HEAD. Первоначальные изменения продолжают существовать в истории хранилища. Для большинства ситуаций это является положительным моментом. В любом случае, большинство пользователей интересует только HEAD проекта. Однако, возможны ситуации, когда действительно необходимо удалить последствия фиксации. (Возможно, кто-то случайно зафиксировал конфиденциальный документ.) Сделать это будет не так просто, так как Subversion спроектирована специально таким образом, что бы исключить возможность потери информации. Правки представляют собой не меняющиеся деревья файлов, основывающиеся одно на другом. Удаление правки из хранилища может вызвать эффект домино, создавая беспорядок во всех последующих правках и возможно разрушая все рабочие копии. [15]



Содержание раздела