파일의 이전 SVN 개정으로 되 돌리는 더 좋은 방법은 무엇입니까?


167

실수로 너무 많은 파일을 SVN 저장소에 커밋하고 의도하지 않은 것을 변경했습니다. (한숨) 그들을 이전 상태로 되돌리려면, 내가 생각해 낼 수있는 최선은

svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

이봐! 더 좋은 방법이 없습니까? 왜 이런 식으로 쓸 수 없습니까?

svn revert -r 854 l3toks.dtx

좋아, 나는 v1.4.4 만 사용하고 있지만 1.5 분기의 변경 사항 목록을 훑어 보았고 이것과 직접 관련된 것을 볼 수 없었습니다. 내가 놓친 것이 있습니까?


편집 : 나는 충분히 명확하지 않은 것 같아요. 나는 내가하는 변경 잃을 것이기 때문에 내가 병합을 반대 할 생각하지 않았다 만들고 싶어를! 라고 fileA하고는 fileB모두 수정 된하지만 난 단지 커밋하고 싶었다 fileA; 실수로 입력

svn commit -m "small change"

두 파일을 모두 커밋하고 이제 롤백하고 싶습니다 fileB. 리버스 병합을 사용하면 위에서 설명한 단계보다이 작업을 쉽게 알 수 있습니다.


답변:


243
svn merge -r 854:853 l3toks.dtx

또는

svn merge -c -854 l3toks.dtx

두 명령 은 동일 합니다.


5
이 주셔서 감사합니다, 그냥 상태 뭔가 싶어 - 말하자면, 나는 개정 (855)에있어, 나는 내가 할 경우 개정 854에 파일을 되돌리려 svn merge -c -854 my.file하고 할 svn diff, 하나의 버전을 보여주는 것 전에 854 (이다 853 ); 내가 할 때만 svm merge -c 854 myfile(을 제외하고 -) myfile이 rev 854로 되돌아 간 것 같습니다. 다시 한번 감사합니다.
sdaau

11
위의 첫 번째 옵션이 나를 위해 매력처럼 작동하는 반면 두 번째 옵션이 전혀 작동하지 않는 이유가 있습니까?
skybondsor

7
역 병합 후 커밋하는 것을 잊지 마십시오. 나는 종종 :) 잊지
바이 니스 프라에게

11
이 두 명령의 차이점이 무엇인지 명시하지 않기 위해서는 실제로 1을 빼야합니다. 불쌍한 답변
화난 Dan

4
@sprog-차이가 있다면 알고 싶습니다.
orip

34

svn 책 의 " 변경 취소 "섹션을 확인하십시오.


5
외부 리소스에 대한 링크가 권장되지만 링크 주위에 컨텍스트를 추가하여 동료 사용자가 그 정보와 그 이유를 알 수 있도록하십시오. 대상 사이트에 연결할 수 없거나 영구적으로 오프라인 상태가되는 경우 항상 중요한 링크의 가장 관련성있는 부분을 인용하십시오.
user2084795

32

이전에 주어진 답변을 반복하여 약간의 공간을 사용하는 것은 죄송합니다. 그러나 이것은 항상 문제가됩니다.

로컬 파일을 최신 개정판 인 854로 업데이트했다고 가정 해 보겠습니다. 그런 다음 이전 개정판 (몇몇 이전의 파일 버전, 개정판 851)을 원합니다.

복사가 작동합니다 :

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

.. 그러나 repo URL에 대한 grepping 수 없습니다 :)

업데이트가 작동하는 것 같습니다.

svn up -r 851 ./l3toks.dtx

...하지만 로컬 사본을 "새로 체크 아웃 한"또는 "온라인 개정과 동일"으로 표시합니다 (예 : Tortoise / RabbitVCS에서 녹색 확인 표시가 나타남) svn ci -m "rolled back to r 851". subversion실행 파일은 로컬 변경 사항을 알지 못하며 온라인 저장소에 아무것도 업로드하지 않아도됩니다.

이미 대답했듯이 리버스 병합은 작동하지만이 경우 바로 가기 구문에 의존해서는 안됩니다. 그러나 구체적으로 말하면 :

svn merge -r HEAD:851 l3toks.dtx
--- Reverse-merging r854 through r852 into 'l3toks.dtx':
U    l3toks.dtx

나는 인정해야한다-나는 문장을 이해하지 못할 것이다. " r854를 통해 r854를 파일로 병합 " "의미 만이 파일의 r851을 가지고, 당신은 이전에 로컬 가졌던 덮어 쓰기 - 그리고 그것은 최신 온라인 버전과 다른 것으로 표시되기 때문에, 온라인에서 새로운 '롤백'개정판으로 다시 확인할 수 있지만 다음과 같이 생각합니다. :)

이 후, 우리는 사용할 수 있습니다 svn diff 로컬로 올바른 개정판을 가져 오면 빠른 확인을 위해 . 또한 파일은 Tortoise / RabbitVCS에 빨간색 느낌표 (즉, 최신 커밋 된 버전과 다른)로 표시되므로 svn ci -m "rolled back to r 851"이번에는 실행할 수 있습니다.

또한 리버스 병합 후 마지막으로 마음이 바뀌면 ( 즉, 어쨌든 최신 HEAD 개정판을 계속 사용하고 싶다면 854-로컬로 851로 롤백했지만 아직 롤백을 커밋하지 않은 후) )를 사용하면 안됩니다 svn up. 왜냐하면 이미 " 개정 854에서 " "에 . 대신 svn revert --recursive .또는 유사한 것을 사용하십시오 ...

건배!

참조 : Subversion을 사용하여 변경 사항을 롤백하는 방법-Jacob Wright – Flex, AIR, PHP 등

편집 : ... 그리고 분명히와 동일한 효과를 svn merge -r HEAD:851 l3toks.dtx얻을 수 있습니다 :

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.

2
svn 내보내기는 항상 원하는 것을 수행하기 때문에 항상 좋아야합니다. 특정 개정판에서 파일을 확인하십시오. 역 병합은 로컬 변경 사항을 지정된 버전과 병합하려고 시도합니다. 복잡하고 미친 작업입니다. 조심하지 않으면 오류가 발생하기 쉽습니다!
Falco

1
리버스 병합에 문제가있었습니다. 이유를 알아 내기보다는 방금 내보내기를 시도했지만 완벽하게 작동했습니다. 내보내기 만 사용하는 것이 좋습니다. --force디렉토리를 덮어 쓰는 데 사용할 수 있습니다 . 변경 사항을 덮어 쓰게됩니다.
Nick

실제로 무슨 일이 일어나고 있는지에 대한 아주 좋은 설명! 나는 AnkhSVN과 TortoiseSVN을 자주 사용하며 어디에서나 사용할 수있는 곳이 없습니다 svn export.
콘래드

@Conrad는, 당신은 당신의 저장소 컨텍스트 (마우스 오른쪽 클릭) 메뉴에서 TortoiseSVN을에서 AnkhSVN에서 "내보내기 ..."와 "내보내기"를 클릭하여 그것을 사용
nitinr708

10

나는 최근에 오래된 빌드를 디버깅하기 위해 특정 개정으로 되돌려 야했고 이것은 마술처럼 작동했습니다.

svn up -r 3340 (or what ever your desired revision number)

로컬 변경에 신경 쓰지 않았기 때문에 "tc"옵션을 사용하여 모든 충돌을 해결해야했습니다 (복귀하기 전에 내가 돌보는 모든 것을 확인했습니다)

헤드 리비전으로 돌아가는 것도 간단했습니다.

svn up

5

찾고있는 것을 "역 병합"이라고합니다. SVN 서적의 병합 기능에 대한 문서를 참조해야합니다 (luapyad 또는 해당 게시물의 첫 번째 주석 작성자가 지적합니다). Tortoise를 사용하는 경우 로그보기로 이동하여 마우스 오른쪽 단추를 클릭 한 후 실수 한 부분에서 "이 개정판의 변경 사항 되돌리기"를 선택할 수도 있습니다.


4

리버스 병합은 정확히 원하는 것입니다 (luapyad의 답변 참조). 전체 디렉토리 대신 잘못 커밋 된 파일에 병합을 적용하십시오.


4

마지막 체크인 만 취소하려면 다음을 사용할 수 있습니다.

svn merge -r head:prev l3toks.dtx

그렇게하면 현재 버전 번호와 이전 버전 번호를 찾을 필요가 없습니다.


4

svn merge는 버전을 병합하지 않고 되돌릴 수 있습니다. 즉, HEAD 버전에 약간의 추가 사항이 있으면 이전 버전과 병합하면 변경 사항이 유지됩니다.

svn cat을 사용하여 파일로 리디렉션합니다.

svn cat -r 851 l3toks.dtx > l3toks.dtx

그런 다음 해당 파일에 851 개의 컨텐츠가 있으며 다시 체크인 할 수 있습니다.


3

SVN 플러그인 과 함께 Eclipse IDE 를 사용하면 다음과 같이 할 수 있습니다.

  1. 되돌리려는 파일 (또는 실수로 파일을 삭제하고 다시 추가하려는 경우 포함 된 폴더)을 마우스 오른쪽 단추로 클릭하십시오.
  2. " 팀> 전환 "을 선택하십시오.
  3. "개정"라디오 버튼을 선택하고 되돌리려는 개정 번호를 입력하십시오. 확인을 클릭하십시오
  4. 동기화 관점으로 이동
  5. 되돌리려는 모든 파일을 선택하십시오.
  6. 선택을 마우스 오른쪽 버튼으로 클릭하고 " 재정의 및 커밋 ... "

파일을 원하는 수정 버전으로 되돌립니다. SVN은 변경 사항을 새로운 커밋으로 간주합니다. 즉, 변경 사항에 새 개정 번호가 부여되고 이전 개정과 새 개정 번호 사이에 링크가 없습니다. 커밋 주석에서 해당 파일을 특정 개정으로 되돌 리도록 지정해야합니다.

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