문제

저는 친구와 함께 프로젝트를 진행하고 있으며 코드의 이전 버전으로 돌아와서 현재로 설정하고 싶습니다. 어떻게해야하나요?

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

내 PC에 원하는 버전이 있지만 커밋은 실패합니다. 내가 얻는 메시지는 "커밋이 실패, 파일 또는 디렉토리가 오래된 것"입니다.

또한 내 PC에 Subversion 클라이언트가 있습니다.

도움이 되었습니까?

해결책

기본적으로 "거꾸로 병합" - 현재 버전과 이전 버전의 차이를 적용해야합니다. 에게 현재 버전 (따라서 이전 버전처럼 보이는 작업 사본으로 끝납니다)을 다시 커밋합니다. 예를 들어 개정 150 (현재)에서 개정기 140으로 이동합니다.

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

Subversion Red Book은 다음과 같습니다 이것에 대한 좋은 섹션.

다른 팁

당신은 새로운 변경 만 할 수 있습니다 머리 전복 역사의.

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"
    

이 줄을 사용하십시오

SVN 업데이트 -R YouroldRevesion

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

SVN 정보

전체 체크인을 취소하기 위해 Merge를 사용하는 표준 방법은 당신이하고 싶은 일이라면 훌륭하게 작동합니다. 그러나 때때로, 당신이 원하는 것은 단일 파일을 되돌리기 만하면됩니다. 합법적 인 방법은 없지만 해킹이 있습니다.

  1. SVN 로그를 사용하려는 버전을 찾으십시오.
  2. SVN의 내보내기 부하 명령 사용 :

    SVN 수출 http : // url-to-your-file@123 /tmp/filename

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

조금 더 구식

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

그런 다음 평소

svn diff
svn commit

나는 이것이 가장 적합하다고 생각한다 :

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

예를 들어:

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

이전 개정판으로 병합 된 코드가 포함되어 있으면 커밋 할 수 있습니다.

이것이 내가 한 일과 나를 위해 일한 것입니다.

나는 특정 시간 동안 내가 한 여러 커밋의 변경 사항을 취소하고 이전 커밋 포인트로 가고 싶습니다.

  1. 팀으로 이동 -> 역사 쇼.
  2. 무시하려는 수정 사항을 마우스 오른쪽 버튼으로 클릭하십시오.
  3. "변경 변경"옵션을 선택하십시오.

이렇게하면 리버스 병합이 실행되어 작업 사본의 변경 사항을 취소합니다.

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

복귀하려는 최고 계층 구조를 마우스 오른쪽 버튼으로 클릭하십시오 >> Revert 또는 Revert to Revision

프로젝트를 마우스 오른쪽 버튼으로 클릭하십시오.> 개정 또는 URL로 교체하십시오. 반복 할 특정 개정판을 선택하십시오.

이제 로컬 업데이트 코드 버전을 저장소에 커밋하십시오. 코드 기반을 특정 개정판으로 되돌립니다.

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

실수로 작은 변경을 할 때 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"

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

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

여기에 있습니다 또한 실행 취소 변경에 대한 설명.

Jon Skeet의 대답은 간단히 말해서 거의 해결책이지만, 당신이 나와 같다면 설명을 원할 것입니다. 전복 매뉴얼은 이것을 a라고 부릅니다

체리 픽 병합

남자 페이지에서.

  1. 이 양식은 'Cherry-Pick'병합이라고합니다.

    '역 범위'를 사용하여 변경 사항을 취소 할 수 있습니다. 예를 들어, 소스와 대상이 동일한 지점을 참조 할 때, 이전에 커밋 된 개정판은 '취소'될 수 있습니다. 안에 역 범위, n은 '-r n : m'또는 '-c'옵션이 음수로 사용됩니다. '-c -m'은 '-r m :'과 동일합니다. 이와 같은 변경 사항은 '리버스 병합'을 수행하는 것으로도 알려져 있습니다.


  • 소스가 파일 인 경우 해당 파일에 차이가 적용됩니다 (이전 변경 사항을 역전시키는 데 유용합니다). 그렇지 않으면 소스가 디렉토리 인 경우 대상이 기본값을 '.'.

    정상적인 사용에서는 로컬 수정이없고 스위치 된 하위 트리가없는 단일 개정에서 작업 사본을 최신 상태로 유지해야합니다.

예시:

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

이것은 로컬 사본 [2983] (위의 견적에 따라 서버와 동기화되어야 함)을 서버의 개정 289와 대체합니다. 변경 사항은 로컬로 발생하므로 청정 체크 아웃이 있으면 변경을 수행하기 전에 변경 사항을 검사 할 수 있습니다.

이 페이지에는 위험한 답변이 많이 있습니다. SVN 버전 1.6이므로 업데이트 -R을 수행하면 트리 충돌이 발생할 수 있으며, 이는 트리 충돌에 대한 정보를 얻기 위해 검색하는 Kafkeresque 악몽을 잃을 수있는 데이터로 빠르게 확대됩니다.

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

svn merge -r HEAD:12345 .

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

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

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

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

  2. 새로 추가되고 무시 된 파일을 얻으려면 모든 줄을 그려냅니다.

  3. 그것들을 교체하십시오 //.

  4. 및 rm -rf 모든 라인.

    SVN 상태-No-Indore | grep '^[? i]'| sed "s/^[? i] //"| XARGS -I {} rm -rf "{}"

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top