Отменить последний коммит в 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-й).

Статьи и новости схожей тематики:

Оставьте свой отзыв