Вопрос или проблема
У меня есть файл, который в данный момент находится в редакции X. Я хотел бы вернуть его к редакции X-1 и зафиксировать как X-1. Однако, когда я просматриваю фиксацию для X-1, SVN (я использую Tortoise в данном случае) сообщает, что изменений нет. Как такое может быть? И как мне зафиксировать возвращённый файл?
Я не уверен, правильно ли я понимаю суть вашего вопроса, но, возможно, у вас есть недопонимание того, как работает SVN, а также что такое команда “отменить”.
Во-первых, команда “отменить” предназначена только для избавления от изменений, которые вы ещё не зафиксировали. Она отменяет любые изменения, которые вы видите с помощью svn статус
или в TortoiseSVN с помощью “проверить модификации”. Не больше того.
Во-вторых, невозможно зафиксировать редакцию ниже текущей редакции. В SVN файлы не имеют редакций. Редакции имеют файлы. И номера редакций всегда увеличиваются, никогда не уменьшаются. Думайте о редакции в SVN как о моментальном снимке всего в репозитории. Технически, вы должны говорить “файл foo как он существовал в редакции 123”, вместо “редакция 123 файла foo”. Последнее не совсем корректно и может привести к ошибкам в некоторых случаях.
Наконец, то, что вы, КАЖЕТСЯ, хотите сделать, это удалить некоторые изменения в файле. Вы делаете это, создавая НОВУЮ редакцию файла, используя концепцию “обратного слияния”. С командной строки вы делаете слияние файла, указывая отрицательную редакцию или обратный диапазон редакций, чтобы отменить изменения в этих редакциях. Затем вы можете зафиксировать, чтобы получить новую редакцию, содержащую ваш файл с этими изменениями в обратном порядке. TortoiseSVN делает это легко: просто откройте диалог “показать журнал”, щелкните правой кнопкой мыши на редакции, которую хотите вернуть, и выберите “отменить изменения из этой редакции”. Затем вам нужно будет зафиксировать, как обычно.
В любом случае, сделайте этот шаг “обратного слияния” из рабочей копии, указывающей на HEAD. Ваша новая редакция всегда будет следовать за HEAD, поскольку так работает SVN.
.
Ответ или решение
Теория
Ваш вопрос касательно системы управления версиями Subversion (SVN) и TortoiseSVN подразумевает некоторое недопонимание того, как работает SVN. Важно уточнить, что SVN — это система управления версиями, которая фиксирует и отслеживает изменения в файлах в своей базе данных. Каждый коммит создает новую "ревизию" или снапшот всей репозитории, отражающий состояние всех файлов на момент коммита. Ревизии в SVN являются глобальными для всей репозитории и всегда возрастают, что означает, что нет возможности откатить отдельный файл на предыдущую ревизию без создания новой ревизии.
Команда revert
в SVN используется для отмены изменений, которые еще не были зафиксированы коммитом, и не возвращает файл к предыдущей ревизии. Это командование просто возвращает файл к состоянию последнего коммита в вашей рабочей копии.
Пример
Рассмотрим следующий сценарий: у вас есть файл в ревизии X, и вы хотите откатить его состояние к ревизии X-1, чтобы затем закоммитить эти изменения. Попробуем провести пример с помощью команды "обратного слияния" (reverse merge), что позволяет "отменить" изменения между ревизиями.
Предположим, что мы работаем с файлом file.txt
. Вы хотите отменить изменения из ревизии 5. Это можно сделать следующим образом:
-
Открытие лога в TortoiseSVN:
- Нажмите правой кнопкой мыши на рабочей копии проекта.
- Выберите "Show log".
-
Выбор нужной ревизии:
- Найдите в списке ревизию 5.
- Щелкните правой кнопкой мыши по этой ревизии.
- Выберите "Revert changes from this revision".
Это действие приведет к тому, что все изменения, внесенные в этой ревизии, будут отменены в вашей рабочей копии. Затем вы можете закоммитить эти изменения, создав новую ревизию, описывающую откат.
Применение
Теперь, когда у вас есть понимание, как работает процесс revert и как выполнять обратное слияние, рассмотрим детально процесс. Команда для обратного слияния на командной строке будет следующей:
svn merge -c -5 URL_репозитория@HEAD
Данная команда выполняет "отрицательное" или обратное слияние изменений, содержащихся в ревизии 5, в вашу рабочую копию. Далее вам необходимо закоммитить эти изменения:
svn commit -m "Cancel changes from revision 5"
Это создаст новую ревизию, в которой изменения из ревизии 5 будут отменены. Помните, что SVN не позволяет "удалять" ревизии или фактически откатываться к предыдущей ревизии. Все изменения фиксируются и сохраняются в репозитории в порядке их поступления.
Подводя итог, важно помнить, что система SVN предназначена для управления изменениями в коде и отслеживания прогресса разработки. Это мощный инструмент, но он требует понимания ключевых концепций, таких как структура ревизий, обратное слияние и управление рабочими копиями. Эти знания помогают эффективно контролировать и вносить изменения в проекты. Изучение и правильное применение возможностей, предоставляемых TortoiseSVN и SVN, позволят избегать ошибок и недоразумений в управлении кодом.