Как вернуть SVN-фиксацию?
Я нашел несколько примеров того, как вернуть SVN-фиксацию, например
svn merge -r [current_version]:[previous_version] [repository_url]
или
svn merge -c -[R] .
Но ни один из них, похоже, не работает. Я пробовал эти команды и проверял файлы, которые были изменены вручную.
Как вернуть фиксацию с номером версии 1944? Как проверить, что реверс был выполнен (без просмотра фактического файла, чтобы изменения были отменены)?
Ответы
Ответ 1
Оба примера должны работать, но
svn merge -r UPREV:LOWREV .
диапазон отмены
svn merge -c -REV .
отменить отдельную ревизию
в этом синтаксисе - если текущий dir является WC и (как это необходимо сделать после каждого слияния), вы будете фиксировать результаты
Вы хотите видеть журналы?
Ответ 2
Если вы используете TortoiseSVN клиент, это легко сделать через диалог Показать журнал.
Ответ 3
svn merge -r 1944:1943 .
должен возвращать изменения r1944 в вашей рабочей копии. Затем вы можете просмотреть изменения в своей рабочей копии (с помощью diff), но вам нужно будет зафиксировать, чтобы применить возврат в репозиторий.
Ответ 4
Сначала верните рабочую копию в 1943 году.
> svn merge -c -1943 .
Во-вторых, проверьте, что должно произойти.
> svn status
В-третьих, зафиксируйте версию 1945.
> svn commit -m "Fix bad commit."
В-четвертых, посмотрите на новый журнал.
> svn log -l 4
------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line
Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line
This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line
This was a good commit.
------------------------------------------------------------------------
Ответ 5
Невозможно "раскрыть" ревизию, но вы можете вернуть свою рабочую копию на версию 1943 и зафиксировать ее как версию 1945. Варианты 1943 и 1945 будут идентичными, эффективно возвращая изменения.
Ответ 6
Следующее будет выполнять сухой ход, как говорится. HEAD - текущая версия, PREV - это предыдущий, затем путь к вашему файлу или зафиксированный элемент:
svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk
Если сухой прогон выглядит хорошо, запустите команду без -dry-run
Проверьте изменения в ревизии и повторите фиксацию. Чтобы просмотреть номера версий, выполните следующие действия:
svn log
Ответ 7
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
&& svn commit -m "undid rev $REV" $F
Ответ 8
Алекс, попробуйте это: svn merge [WorkingFolderPath] -r 1944: 1943
Ответ 9
Я попробовал выше, (svn merge
), и вы правы, он подключается. Однако
svn update -r <revision> <target> [-R]
похоже, работает, но не является постоянным (мой svn просто показывает старую ревизию). Поэтому мне пришлось
mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>
В моем конкретном случае моя цель interfaces/AngelInterface.php
. Я вносил изменения в файл, исправлял их, обновлял компьютер сборки, запускал компилятор phpdoc и обнаружил, что мои изменения были пустой тратой времени. svn log interfaces/AngelInterface.php
показывает мое изменение как r22060, а предыдущая фиксация в этом файле была r22059. Поэтому я могу svn update -r 22059 interfaces/AngelInterface.php
, и я снова получаю код, как и в -r22059. Затем: -
mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php
В качестве альтернативы я мог бы сделать то же самое в каталоге, указав . -R
вместо interfaces/AngelInterface.php
во всех вышеперечисленных.
Ответ 10
Хотя предложенные предложения уже могут работать для некоторых людей, это не работает для моего случая. При выполнении слияния пользователи в rev 1443
, которые обновляют до rev 1445
, все еще синхронизируют все файлы, измененные в 1444
, даже если они равны 1443
из слияния. Мне нужно, чтобы конечные пользователи вообще не видели обновления.
Если вы хотите полностью скрыть фиксацию, это возможно, создав новую ветку при правильной ревизии и затем поменяв ветки. Единственное, что вам нужно удалить и добавить все блокировки.
copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>
Это сработало для меня, возможно, это будет полезно кому-то другому =)
Ответ 11
svn merge -c -M PATH
Это спасло мою жизнь.
У меня была одна и та же проблема, после того, как я снова вернулся, я не видел старый код.
После выполнения вышеуказанной команды я получил чистый старый код версии.
Ответ 12
Если вы хотите полностью удалить фиксации из истории, вы также можете сделать дамп репо в конкретной ревизии, а затем импортировать этот дамп. В частности:
svnrdump dump -r 1:<rev> <url> > filename.dump
Команда svnrdump выполняет ту же функцию, что и svnadmin dump, но работает на удаленном репо.
Далее просто импортируйте файл дампа в свое репо. Это было проверено, чтобы хорошо работать на Beanstalk.
Ответ 13
Невозможно вернуться к конкретной версии bcoz, так как мы, люди, хорошо учили о слиянии двух рек, но не для того, чтобы отделить соус от карри (и это также имеет математику как управление версиями). Лучший и безопасный способ отменить свой код - проверить свой код на двух местах. Поэтому после фиксации (с первой проверки) вы обнаружите проблемы, которые можете совершить при второй проверке.