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.