SVN 커밋을 되돌리려면 어떻게해야합니까?


303

SVN 커밋을 되 돌리는 방법에 대한 다양한 예를 찾았습니다.

svn merge -r [current_version]:[previous_version] [repository_url]

또는

svn merge -c -[R] .

그러나 둘 다 작동하지 않는 것 같습니다. 나는 그 명령을 시도하고 수동으로 변경된 파일을 확인했습니다.

개정 번호가 1944 인 커밋을 되돌리려면 어떻게해야합니까? 실제 파일을 보지 않고 되돌리기가 완료되었는지 확인하려면 어떻게해야합니까?


16
그들 중 아무도 일하지 않아서 대답을 받아들이지 않았습니까?
— 2rs2ts

4
리터럴 답변을 원하면 "svn merge -c -1944"를 사용하십시오. 그것이 작동하는지 확인하려면 : "svn diff"
— John Sampson



경우에 1943 (좋은 커밋), 1944 (나쁜 커밋), 1945 (좋은 커밋), 1946 (좋은 커밋)이 있다면 어떻게 될까요? 이제 1944 (bad commit) 만 제거하고 1944 이후의 모든 개정을 유지하려고합니다.이 모든 개정에서 1943,1945,1946 (1944 만 제거)과 같은 결과를 원한다는 것을 의미합니다.
— Bhavin_m

답변:


448

두 예제 모두 작동해야하지만

svn merge -r UPREV:LOWREV . 범위 취소

svn merge -c -REV . 단일 개정 실행 취소

이 구문에서-현재 디렉토리가 WC이고 모든 병합 후에 수행 해야하는 것처럼 결과를 커밋합니다.

로그를 보시겠습니까?


9
@dwjohnston-예, 병합은 항상 WC에서 수행되며 서버 측 작업은 아닙니다.
— Lazy Badger

14
svn: Merge source required. 주사위가 없습니다.
— 2rs2ts

27
@ 2rs2ts는 '현재 디렉토리에서 이것을하십시오'를 지정하기 위해 후행 점을 잊어 버린 것처럼 보입니다.
— Dalin

14
동시에 여러 개의 단일 커밋을 수행 할 수도 있습니다.svn merge -c -42587,-42589 .
— mlathe

1
@ahnbizcad-실행 취소하려는 개정 (단일)
— Lazy Badger

130

TortoiseSVN 클라이언트를 사용하는 경우 로그 표시 대화 상자를 통해 쉽게 수행 할 수 있습니다 .


5
이것이 가장 쉬운 방법입니다
— Markku K.

5
이것은 구식입니다. 현재 버전에서 더 이상 클라이언트에 사용 가능한 컨텍스트 메뉴가 없습니다.
— user1789573

19
뭐? TortoiseSVN은 상황에 맞는 메뉴와 생성되는 대화 상자입니다. "컨텍스트 메뉴가 더 이상 없습니다"는 무슨 뜻입니까? 가장 확실합니다!
— Ben

@ Ben user1789573이 답변에 링크 된 자습서의 "컨텍스트 메뉴"에 대한 언급이 약간 넘어 졌다고 생각합니다.
— Tom Catullo

2
나중에 이것을 볼 수 있다면 거기에 있습니다. 로그 표시 화면에서 개정을 마우스 오른쪽 버튼으로 클릭하면 "이 개정으로 되돌리기"옵션이 있습니다. 이것은 TortoiseSVN 1.9.4 빌드 27285에 있습니다. 방금 사용했으며 제대로 작동한다고 말할 수 있습니다.
— Bruce Van Horn

65

svn merge -r 1944:1943 .작업 사본에서 r1944의 변경 사항을 되돌려 야합니다. 그런 다음 diff를 사용하여 작업 복사본의 변경 사항을 검토 할 수 있지만 되돌리기를 저장소에 적용하려면 커밋해야합니다.


4
작동하지 않습니다. 병합 소스가 필요합니다. svn merge -r 1944:1943 .대신 시도 했지만 아무것도 변경되지 않았습니다.
— Alex

r1944 이후로 저장소가 발전 했습니까? 그렇다면 r1943과 r1944 사이의 변경 사항과 동일한 줄에 충돌하는 변경 사항이 있습니까?
— onon15

나는 개정 1945에 있고 충돌이없는 것 같습니다. 아무것도 제공 하지도 svn status않습니다 svn diff.
— Alex

7
오류 :svn: Try 'svn help' for more info svn: Merge source required
— Alex

5
그러나 svn merge -r 1945:1943 .효과가 있었던 것 같습니다. 이해합니다 : '나쁜'커밋을 '전에'에서 작업 저장소로 버전을 병합해야합니다. 이전 커밋의 간단한 '복귀'를 원할 때 좋습니다. 그러나 버전 1900의 변경 사항을 되돌리려면 어떻게해야합니까?
— Alex

45

먼저 작업 복사본을 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.
------------------------------------------------------------------------

1
경우에 1943 (좋은 커밋), 1944 (나쁜 커밋), 1945 (좋은 커밋), 1946 (좋은 커밋)이 있다면 어떻게 될까요? 이제 1944 (bad commit) 만 제거하고 1944 이후의 모든 개정을 유지하려고합니다.이 모든 개정에서 1943,1945,1946 (1944 만 제거)과 같은 결과를 원한다는 것을 의미합니다.
— Bhavin_m

26

개정을 "커밋 해제"하는 것은 불가능하지만 작업 복사본을 버전 1943으로 되돌리고이를 버전 1945로 커밋 할 수 있습니다. 버전 1943과 1945는 동일하며 변경 사항을 효과적으로 되돌립니다.


18
성가신 정확성을 위해 리포지토리에 대한 관리자 액세스 권한이 있으면 "커밋 해제"할 수 있다고 언급합니다. svn dump그리고 나서를 사용하여 지정된 개정판까지 복제 저장소를 작성합니다 svn load. 그러나 물론 이것은 정상적인 상황에서는 사용해서는 안됩니다.
— onon15

4
커밋을 취소하고 싶지 않고 특정 커밋을 뒤집어 새 커밋 번호를 만들고 싶습니다. 세트는 1944 년 버전을 체크 아웃하고 1945 년에 커밋을했으며 '돌아 가기'를 원한다고 말합니다. 그런 다음 파일이 버전 1944의 파일과 동일한 버전 1946을 원합니다. 물론 (역사 기록 제외) 문제는 남아 있습니다. 어떻게해야합니까? 명령은 무엇입니까?
— Alex

//, @Alex, 나도 이것에 관심이 있으며, 특히 비슷한 것에 관심이 $ git revert있습니다. 오랫동안 Git을 사용한 후에 SVN을 배우기가 다소 어렵다는 것을 알았습니다.
— Nathan Basanese

10

다음과 같이 드라이 런을 수행합니다. HEAD는 현재 버전이고 PREV는 이전 버전이며 파일 경로 또는 커밋 된 항목은 다음과 같습니다.

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

드라 이런이 양호 해 보이면 --dry-run없이 명령을 실행하십시오.

개정 변경 사항을 확인한 후 다시 커밋하십시오. 버전 번호를 찾으려면 다음을 시도하십시오.

svn log

4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F

로컬 사본이 잘못된 개정판과 달라야합니까?
— Eliezer Miron

2

Alex, 이것을 시도하십시오 : svn merge [WorkingFolderPath] -r 1944 : 1943


2

주어진 제안은 이미 일부 사람들에게는 효과가 있지만 내 경우에는 효과가 없습니다. 병합을 수행 할 때로 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>

이것은 나를 위해 일했습니다. 아마도 다른 누군가에게 도움이 될 것입니다 =)


2
svn merge -c -M PATH

이것은 내 생명을 구했습니다.

나는 같은 문제를 겪고 있었고, 되 돌린 후에도 오래된 코드가 보이지 않았습니다. 위의 명령을 실행 한 후 깨끗한 이전 버전 코드를 얻었습니다.


1

위의 ( 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모든 위치를 대신 하여 디렉토리에서 동일한 작업을 수행 할 수 있습니다.


1
이미 말했듯이, 할 수없는 것은 심판을 직접 해킹하여 자식에서 할 수있는 것처럼 커밋을 기록에서 제거하는 것입니다. 리포지토리를 사용하여 소스를 원하는 방식으로 변경하고 변경 사항으로 커밋하면됩니다.
— sibaz

더 자세히 조사한 결과 svnadmin을 사용하여 기록에서 커밋을 제거 할 수 있지만 그에 대해 강력히 권장합니다. stackoverflow.com/questions/5566327/…
— sibaz

0

히스토리에서 커밋을 완전히 제거하려면 특정 개정판에서 저장소를 덤프 한 다음 해당 덤프를 가져올 수도 있습니다. 구체적으로 특별히:

svnrdump dump -r 1:<rev> <url> > filename.dump

svnrdump 명령은 svnadmin dump와 동일한 기능을 수행하지만 원격 저장소에서 작동합니다.

다음으로 덤프 파일을 선택한 리포지토리로 가져옵니다. 이것은 Beanstalk에서 잘 작동하는지 테스트되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.