Subversion에서 이전 버전의 코드로 돌아가려면 어떻게합니까?


486

친구와 프로젝트를 진행 중이며 이전 버전의 코드로 돌아가서 현재 코드로 설정하고 싶습니다. 어떻게합니까?

vs08에서 "anksvn"을 사용하고 있습니다.

PC에 원하는 버전이 있지만 커밋이 실패합니다. 내가받는 메시지는 "커밋이 실패했습니다. 파일 또는 디렉토리가 오래되었습니다."

또한 내 PC에 서브 버전 클라이언트가 있습니다.

답변:


783

기본적으로 "뒤로 병합"해야 합니다. 현재 버전 과 이전 버전 사이의 차이를 현재 버전 적용한 다음 (이전 버전 과 같은 작업 복사본으로 끝남) 다시 커밋합니다. 예를 들어 개정판 150 (현재)에서 개정판 140으로 돌아가려면 다음을 수행하십시오.

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

Subversion Red Book에는 이것에 대한 좋은 섹션이 있습니다.


3
그러나 병합은 내 변경 사항과 새 개정을 재정의하지 않습니다.
Chen Kinnrot 08 년

76
TortoiseSVN을 사용하는 경우 파일을 마우스 오른쪽 단추로 클릭하고 병합을 선택한 다음 수정 범위 병합을 선택하십시오. 로그 상자에 140-150을 입력하고 역 확인란을 클릭하십시오. 그 후 평소처럼 커밋하십시오. Jon의 예제와 동일한 작업을 수행합니다.
DavGarcia

8
이클립스 및 서브 클립을 사용하여 프로젝트, 팀 / 쇼 히스토리를 마우스 오른쪽 단추로 클릭 한 다음 "취소"할 개정을 선택하고 마우스 오른쪽 단추를 클릭하여 "선택한 개정에서 변경 사항 되돌리기"를 선택할 수 있습니다.
fego

36
헤드 리비전에서 되돌리려면 다음과 같이 쓸 수도 있습니다 svn merge -r HEAD:140.
sschmeck

3
@DavGarcia의 TortoiseSVN 명령어는 적어도 TortoiseSVN 1.8.8을 사용하여 개정판의 모든 파일을 되 돌리지 않는 것이 아닙니다. 폴더를 마우스 오른쪽 버튼으로 클릭하고 TortoisSVN-> 로그 표시를 선택하십시오. 되돌리려는 개정판을 선택하고 "이 개정판에서 변경 사항 되돌리기"로 마우스 오른쪽 단추를 클릭하십시오. 변경 사항을 적용하십시오.
mhenry1384

177

서브 버전 히스토리 의 헤드 에서만 새로운 변경 사항을 커밋 할 수 있습니다 .

당신이 당신의 PC에있는 좋은 사본으로 직접 아무것도 할 수없는 이유는 .svn폴더가 과거의 코드임을 알고 있기 때문에 커밋 전에 업데이트가 필요하기 때문입니다.

좋은 개정 번호를 찾아서 되돌리기

  1. 원하는 이전 사본의 개정 번호를 찾으십시오.

    다음을 사용하여 현재 개정판을 받으십시오 .

    svn info --show-item revision
    # or
    svn log
    

    또는 이전 버전의 프로젝트 를 확인 하려면 다음을 사용하십시오.

    svn update -r <earlier_revision_number>

    올바른 개정 번호를 찾을 때까지

  2. 올바른 개정 번호를 기록해 두십시오 ( 123아래 예 참조).

  3. 최신 개정으로 업데이트하십시오.

    svn update
  4. 원하는 개정판과 최신 버전 사이의 모든 변경 사항을 취소하십시오.

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"
    

    (위의 Jon Skeet의 답변과 동일합니다.)

개정 번호를 찾을 수없는 경우

이전 사본을 찾을 수없고 현재 PC에있는 파일을 커밋하려는 경우 :

  1. 좋은 버전의 사본을 만드십시오 (그러나 .svn폴더는 없습니다).

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
    
  2. 이제 최신 버전인지 확인하십시오.

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
    
  3. 작업 버전 상단에 올바른 버전을 복사하십시오.

    이 명령은 올바른 트리에없는 파일을 작업 트리에서 복사하고 삭제하지만 기존 .svn폴더 에는 영향을 미치지 않습니다 .

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/
    

    rsync가없는 경우 사용할 수 cp -a있지만 원하지 않는 파일을 수동으로 삭제해야합니다.

  4. 지금 가지고있는 것을 커밋 할 수 있어야합니다.

    cd project
    svn commit "Reverted to good copy"
    

2
svn은 그것을 수정으로 해석하지 않으므로 커밋 할 수 없습니다.
샌드버그

svn merge -r HEAD : 12345. 되돌릴 올바른 명령이며 update -r을 수행하지 마십시오. 당신은 미친 사람입니다.
Owl

이 답변은 개정 번호를 찾지 못했거나 주요 설명을 고맙게 생각한 사람들이이 답변을 찬성했다고 생각합니다. 두 가지 접근법을 모두 포함하도록 지금 답변을 업데이트했습니다.
joeytwiddle

36

이 줄을 사용하십시오

svn 업데이트 -r yourOldRevesion

다음을 사용하여 현재 개정판을 알 수 있습니다.

svn 정보


15
이렇게해도 문제가 해결되지 않습니다. 대신, 이것은 질문을 할 때 질문자가 있었던 상태를 생성합니다.
Ingo Schalk-Schupp

1
이 조언을 따를 수있을 정도로 불행한 경우 "svn resolve --accept working -R."을 실행하십시오.
Owl

27

병합을 사용하여 전체 체크인을 취소하는 표준 방법은 원하는 경우 효과적입니다. 그러나 때로는 단일 파일을 되돌리기 만하면됩니다. 그렇게 할 수있는 합법적 인 방법은 없지만 해킹이 있습니다.

  1. svn log를 사용하여 원하는 버전을 찾으십시오.
  2. svn의 export 하위 명령을 사용하십시오.

    svn 내보내기 http : // url-to-your-file @ 123 / tmp / filename

(여기서 123은 파일의 올바른 버전에 대한 개정 번호입니다.) 그런 다음 해당 단일 파일을 이동하거나 복사하여 이전 파일을 덮어 씁니다. 수정 된 파일을 체크인하면 완료됩니다.


Tortoise-svn을 사용하여 단일 파일을 마우스 오른쪽 버튼으로 클릭하고 병합 할 수 있습니다. 이것을 사용하는 방법도 있어야 svn합니까?
lc.

10
svn cat -r 123 path-in-your-working-copy > path-in-your-working-copy
dash17291


5

나는 이것이 가장 적합하다고 생각합니다.

예를 들어, 커밋 된 코드에 rev 5612에서 5616 로의 개정이 포함되어 있으면 병합을 뒤로 병합하십시오. 그것은 내 끝에서 작동합니다.

예를 들어 :

svn merge -r 5616:5612 https://<your_svn_repository>/

병합 된 코드가 이전 개정으로 돌아 가면 커밋 할 수 있습니다.


3

이것이 내가하고 일한 것입니다.

특정 시간 동안 수행 한 여러 커밋의 변경 사항을 취소하고 이전 커밋 지점으로 가고 싶습니다.

  1. 팀-> 히스토리 표시로 이동하십시오.
  2. 무시하려는 개정 또는 범위를 마우스 오른쪽 버튼으로 클릭하십시오.
  3. "변경 사항 되돌리기"옵션을 선택하십시오.

작업 복사본의 변경 내용을 취소하면서 역 병합이 실행됩니다.

코드를 검토하고 커밋하십시오.


2

되돌리려는 최상위 계층 구조를 마우스 오른쪽 버튼으로 클릭 >> Revert또는Revert to Revision


2

이전 답변의 대부분은 리버스 병합을 사용했으며 일반적으로 정답입니다. 그러나 그렇지 않은 한 가지 상황 (나에게 일어난 일)이 있습니다.

작은 변경을 할 때 실수로 Unix 줄 끝이있는 파일을 DOS 줄 끝으로 변경하고 커밋했습니다. 이것은 줄 끝을 변경하고 다시 커밋하거나 역 병합하여 쉽게 취소 할 수 있지만 svn blame, 파일의 모든 줄의 소스로 내 목록을 편집 하는 효과가 있습니다. 흥미롭게도 Windows의 TortoiseSVN은 이것의 영향을받지 않으며 명령 줄 만 영향을받습니다 svn blame.

에서보고 한대로 기록을 유지 svn blame하려면 다음을 수행해야한다고 생각합니다.

  • 파일을 삭제하고 커밋하십시오.
  • 저장소에서 파일의 이전 양호한 사본을 헤드에 복사하고 커미트하십시오.
  • 유지하려는 편집 내용을 복원하십시오.

삭제는 약간 무섭지 만 항상 파일을 리포지토리에 저장 했으므로 복원하는 것이 중요하지 않습니다. 다음은 단계를 설명하는 코드입니다. xxx이것이 마지막 양호한 사본의 개정 번호 라고 가정하십시오 .

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

저장소의 사본의 경우 대상은 파일 이름이 아닌 디렉토리 여야합니다.


1

프로젝트> 바꿀 내용> 수정본 또는 URL을 클릭하고 되돌릴 특정 수정본을 선택하십시오.

이제 로컬 업데이트 코드 버전을 저장소에 커밋하십시오. 그러면 코드베이스가 특정 개정으로 돌아갑니다.


1

이 페이지에는 많은 위험한 답변이 있습니다. SVN 버전 1.6 이후로 업데이트 -r을 수행하면 트리 충돌이 발생할 수 있습니다. 이로 인해 트리 충돌에 대한 정보를 찾기 위해 인터넷으로 연결되는 kafkeresque 악몽이 데이터를 잃을 수 있습니다.

버전으로 되 돌리는 올바른 방법은 다음과 같습니다.

svn merge -r HEAD:12345 .

여기서 12345는 버전 번호입니다. 점을 잊지 마십시오.


0

이전 버전과 동기화하고 커밋하십시오. 이것은 트릭을해야합니다.

여기 또한 변경 취소에 대한 설명.


0

Jon Skeet의 대답은 간단히 말해서 해결책이지만, 당신이 나와 같다면 설명을 원할 수도 있습니다. Subversion 매뉴얼은 이것을

체리 픽 병합

매뉴얼 페이지에서.

  1. 이 형식을 '체리 픽'병합이라고합니다. '-r N : M'은 수정본 N과 M 사이의 소스 분기 이력 차이를 나타냅니다.

    '역 범위'를 사용하여 변경을 취소 할 수 있습니다. 예를 들어 소스와 대상이 동일한 분기를 참조 할 경우 이전에 커밋 된 개정은 '실행 취소'될 수 있습니다. A의 리버스 레인지 또는 "-c"옵션은 음수로 사용되는 「M N -r ', N은 M에서보다 큰 "-c -M'에 해당 'M -r'. 이와 같은 변경을 취소하면 '역 병합'을 수행하는 것으로 알려져 있습니다.


  • 소스가 파일 인 경우 해당 파일에 차이가 적용됩니다 (이전 변경 내용을 병합하는 데 유용함). 그렇지 않으면 소스가 디렉토리 인 경우 대상의 기본값은 '.'입니다.

    일반적인 사용법에서 작업 복사본은 단일 수정 버전에서 최신 상태 여야하며 로컬로 수정하거나 하위 트리를 전환하지 않아야합니다.

예:

svn merge -r 2983:289 path/to/file

이것은 로컬 사본 [2983] (위의 인용에 따라 서버와 동기화되어야합니다-귀하의 책임)을 서버의 개정 289로 대체합니다. 변경 사항은 로컬에서 발생합니다. 즉, 체크 아웃이 깨끗하면 변경 사항을 커밋하기 전에 검사 할 수 있습니다.


-1

다음은 나를 위해 일했습니다.

나는 많은 로컬 변경 사항을 가지고 있었고 로컬 사본에서 변경 사항을 버리고 SVN의 마지막 안정 버전을 체크 아웃해야했습니다.

  1. 무시 된 파일을 포함하여 모든 파일의 상태를 확인하십시오.

  2. 새로 추가되고 무시 된 파일을 얻으려면 모든 줄을 정리하십시오.

  3. 로 교체하십시오 //.

  4. 그리고 rm -rf 모든 줄.

    svn 상태-무시 | grep '^ [? I]'| sed "s / ^ [? I] //"| xargs -I {} rm -rf "{}"

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