Отменить последний коммит в SVN
Иногда, возникает ситуация когда нужно отменить последний коммит в SVN. Причины могут быть разные. Например, бывает, что разработчик работает с несколькими ветками и по ошибке делает svn commit не в ту ветку. В этом случае нужно вернуть код на момент предпоследнего коммита. Если говорить более правильно, то отменить коммит нельзя. Здесь под операцией отмены подразумевается еще одна операция svn commit, которая отменит изменения последнего коммита.
И это можно сделать всего двумя командами: svn merge и собственно svn commit.
Допустим, что последняя ревизия 44 ошибочна и нам нужно вернуть содержимое SVN на сервере до 43 ревизии.
Если коротко, то нужно всего-навсего выполнить вот такую команду merge (команда должна быть выполнена из корневого каталога рабочей копии.):
1 | $ svn merge -c -44 . |
-44 - это номер последней ошибочной ревизии со знаком минус.
А затем выполнить svn commit:
1 | $ svn commit -m "Commit 44 was reverted" |
Теперь чуть подробнее и с примерами. С операцией svn merge я более менее знаком хорошо, а вот то, что параметр -с может принимать отрицательные значения я узнал недавно. И в этом минусе и содержится весь “фокус”. Хотя все логично.
Если выполнить команду svn merge с параметром –dry-run, то мы увидим какие файлы будут изменены:
1 | $ svn merge -c 44 . --dry-run |
Как видим ничего изменено не будет, так как рабочая копия (файлы на нашем локальном компьютере) и копия на сервере SVN одинаковы.
А вот если выполним команду вот так (с минусом):
1 2 3 4 | $ svn merge -c -44 . --dry-run --- Reverse-merging r44 into '.': U svn1.txt U 1.txt |
то увидим, что два файла будут изменены и будет выполнен Reverse-merging ревизии 44 в нашу рабочую копию.
Команда svn diff покажет что будет изменено:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ svn diff -c -44 Index: svn1.txt =================================================================== --- svn1.txt (revision 44) +++ svn1.txt (revision 43) @@ -4,4 +4,3 @@ String4 123 123 -New Text Index: 1.txt =================================================================== --- 1.txt (revision 44) +++ 1.txt (revision 43) @@ -1,2 +1 @@ qwey -New Text |
Можем видеть, что из обеих фалов будет удалена строка New Text, которая и была добавлена в 44-й ревизии. И наша рабочая копия будет соответствовать ревизии 43. И эту версию рабочей копии мы и отправим на сервер (это будет ревизия 45), которая будет такой же как и ревизия 43.
Итак, пробуем. В рабочей копии сейчас находится последняя ошибочная ревизия - 44. Вот содержимое файлов:
1 2 3 4 5 6 7 8 9 10 11 | $ cat ./1.txt qwey New Text $ cat ./svn1.txt STRIng1, qwerty String2, asdfg, qazwsxedc String3 String4 123 123 New Text |
Выполняем команду svn merge:
1 2 3 4 5 6 7 8 | $ svn merge -c -44 . --- Reverse-merging r44 into '.': U svn1.txt U 1.txt --- Recording mergeinfo for reverse merge of r44 into '.': U . --- Eliding mergeinfo from '.': U . |
Проверяем рабочую копию:
1 2 3 | $ svn st M svn1.txt M 1.txt |
Смотрим содержимое файлов:
1 2 3 4 5 6 7 8 9 | $ cat ./1.txt qwey $ cat ./svn1.txt STRIng1, qwerty String2, asdfg, qazwsxedc String3 String4 123 123 |
Теперь можно отправлять текущую версию рабочей копии на сервер:
1 2 3 4 5 | $ svn commit -m "Commit 44 was reverted" Sending 1.txt Sending svn1.txt Transmitting file data .. Committed revision 45. |
Чтобы убедится, что ревизия 45 точно такая же как и 43-я выполним команду:
1 | $ svn diff -r43:45 |
Разницы нет. А это значит, что мы “отменили” последний неверный коммит (44-й).
Оставьте свой отзыв