매뉴얼

충돌 해결

가끔 저장소에서 파일을 업데이트/병합하거나 작업 사본을 다른 URL로 전환할 때 충돌이 발생할 수 있습니다. 충돌에는 두 가지 종류가 있습니다.

파일 충돌

파일 충돌은 두 명(또는 그 이상)의 개발자가 파일의 동일한 몇 줄을 변경했을 때 발생합니다.

트리 충돌

트리 충돌은 한 개발자가 파일이나 폴더를 이동/이름 변경/삭제했는데, 다른 개발자도 해당 파일이나 폴더를 이동/이름 변경/삭제했거나 수정했을 때 발생합니다.

파일 충돌

파일 충돌은 두 명 이상의 개발자가 파일의 동일한 몇 줄을 변경했을 때 발생합니다. Subversion은 프로젝트에 대해 아무것도 모르기 때문에 충돌 해결은 개발자에게 맡겨집니다. 텍스트 파일의 충돌 영역은 다음과 같이 표시됩니다.

<<<<<<< filename
your changes
=======
code merged from repository
>>>>>>> revision
      

또한, 모든 충돌 파일에 대해 Subversion은 디렉터리에 세 개의 추가 파일을 배치합니다.

filename.ext.mine

이 파일은 작업 사본을 업데이트하기 전에 작업 사본에 존재했던 파일입니다. 즉, 충돌 마커가 없습니다. 이 파일에는 최신 변경 사항만 포함되어 있습니다.

filename.ext.rOLDREV

이 파일은 작업 사본을 업데이트하기 전에 BASE 리비전이었던 파일입니다. 즉, 최신 편집을 하기 전에 체크아웃했던 파일입니다.

filename.ext.rNEWREV

이 파일은 작업 사본을 업데이트할 때 Subversion 클라이언트가 서버에서 방금 받은 파일입니다. 이 파일은 저장소의 HEAD 리비전에 해당합니다.

TortoiseSVN충돌 편집을 사용하여 외부 병합 도구/충돌 편집기를 실행하거나, 어떤 텍스트 편집기를 사용하여 수동으로 충돌을 해결할 수 있습니다. 코드의 최종 모습을 결정하고, 필요한 변경 사항을 적용한 후 파일을 저장해야 합니다. TortoiseMerge 또는 다른 인기 있는 도구와 같은 병합 도구를 사용하는 것이 일반적으로 더 쉬운 옵션입니다. 이러한 도구는 일반적으로 관련 파일을 3개 창으로 표시하며 충돌 마커에 대해 걱정할 필요가 없기 때문입니다. 텍스트 편집기를 사용하는 경우 <<<<<<< 문자열로 시작하는 줄을 찾아야 합니다.

그 후 TortoiseSVN해결됨 명령을 실행하고 수정 사항을 저장소에 커밋하십시오. 해결 명령이 실제로 충돌을 해결하는 것은 아니라는 점에 유의하십시오. 이 명령은 filename.ext.minefilename.ext.r* 파일을 제거하여 변경 사항을 커밋할 수 있도록 합니다.

이진 파일에 충돌이 있는 경우 Subversion은 파일을 직접 병합하려고 시도하지 않습니다. 로컬 파일은 변경되지 않은 상태로 유지되며(마지막으로 변경한 것과 동일), filename.ext.r* 파일이 남아 있습니다. 변경 사항을 버리고 저장소 버전을 유지하려면 되돌리기(Revert) 명령을 사용하십시오. 본인 버전을 유지하고 저장소 버전을 덮어쓰려면 해결됨(Resolved) 명령을 사용한 다음 본인 버전을 커밋하십시오.

상위 폴더를 마우스 오른쪽 버튼으로 클릭하고 TortoiseSVN해결됨...을 선택하면 여러 파일에 대해 해결됨(Resolved) 명령을 사용할 수 있습니다. 이렇게 하면 해당 폴더의 모든 충돌 파일을 나열하는 대화 상자가 나타나며, 해결된 것으로 표시할 파일을 선택할 수 있습니다.

속성 충돌

속성 충돌은 두 명 이상의 개발자가 동일한 속성을 변경했을 때 발생합니다. 파일 내용과 마찬가지로 충돌 해결은 개발자만 수행할 수 있습니다.

변경 사항 중 하나가 다른 것을 재정의해야 하는 경우 로컬 속성을 사용하여 해결 또는 원격 속성을 사용하여 해결 옵션을 선택하십시오. 변경 사항을 병합해야 하는 경우 속성 수동 편집을 선택하고, 속성 값이 어떻게 되어야 하는지 정리한 다음 해결됨으로 표시하십시오.

트리 충돌

트리 충돌은 한 개발자가 파일이나 폴더를 이동/이름 변경/삭제했는데, 다른 개발자도 해당 파일이나 폴더를 이동/이름 변경/삭제했거나 수정했을 때 발생합니다. 트리 충돌을 유발할 수 있는 다양한 상황이 있으며, 이들 모두 충돌을 해결하기 위한 다른 단계를 필요로 합니다.

Subversion에서 파일이 로컬로 삭제되면 로컬 파일 시스템에서도 삭제되므로, 트리 충돌의 일부이더라도 충돌 오버레이를 표시할 수 없으며 마우스 오른쪽 버튼을 클릭하여 충돌을 해결할 수 없습니다. 대신 수정 사항 확인 대화 상자를 사용하여 충돌 편집 옵션에 접근하십시오.

TortoiseSVN은 변경 사항을 병합할 올바른 위치를 찾는 데 도움이 될 수 있지만, 충돌을 해결하기 위해 추가 작업이 필요할 수 있습니다. 업데이트 후 작업 BASE는 항상 업데이트 시 저장소에 있던 각 항목의 리비전을 포함한다는 점을 기억하십시오. 업데이트 후 변경 사항을 되돌리면 저장소 상태로 돌아가며, 본인이 로컬 변경을 시작했을 때의 상태로 돌아가지 않습니다.

로컬 삭제, 업데이트 시 들어오는 편집

  1. 개발자 A는 Foo.c를 수정하고 저장소에 커밋합니다.

  2. 개발자 B는 동시에 작업 사본에서 Foo.cBar.c로 이동했거나, 단순히 Foo.c 또는 해당 상위 폴더를 삭제했습니다.

개발자 B의 작업 사본을 업데이트하면 트리 충돌이 발생합니다.

  • Foo.c는 작업 사본에서 삭제되었지만 트리 충돌로 표시됩니다.

  • 충돌이 삭제가 아닌 이름 변경으로 인한 경우 Bar.c는 추가됨으로 표시되지만 개발자 A의 수정 사항을 포함하지 않습니다.

개발자 B는 이제 개발자 A의 변경 사항을 유지할지 선택해야 합니다. 파일 이름 변경의 경우, Foo.c에 대한 변경 사항을 이름이 변경된 파일 Bar.c로 병합할 수 있습니다. 간단한 파일 또는 디렉토리 삭제의 경우 개발자 A의 변경 사항이 있는 항목을 유지하고 삭제를 폐기할 수 있습니다. 또는 아무것도 하지 않고 충돌을 해결됨으로 표시함으로써 사실상 개발자 A의 변경 사항을 폐기할 수 있습니다.

충돌 편집 대화 상자는 이름이 변경된 Bar.c의 원본 파일을 찾을 수 있는 경우 변경 사항을 병합할 것을 제안합니다. 가능한 이동 원본 파일이 여러 개인 경우, 각 파일에 대한 버튼이 표시되어 올바른 파일을 선택할 수 있습니다.

로컬 편집, 업데이트 시 들어오는 삭제

  1. 개발자 A는 Foo.cBar.c로 이동하고 저장소에 커밋합니다.

  2. 개발자 B는 작업 사본에서 Foo.c를 수정합니다.

또는 폴더 이동의 경우...

  1. 개발자 A는 상위 폴더 FooFolderBarFolder로 이동하고 저장소에 커밋합니다.

  2. 개발자 B는 작업 사본에서 Foo.c를 수정합니다.

개발자 B의 작업 사본을 업데이트하면 트리 충돌이 발생합니다. 단순 파일 충돌의 경우

  • Bar.c는 작업 사본에 일반 파일로 추가됩니다.

  • Foo.c는 추가됨(히스토리 포함)으로 표시되고 트리 충돌이 발생합니다.

폴더 충돌의 경우

  • BarFolder는 작업 사본에 일반 폴더로 추가됩니다.

  • FooFolder는 추가됨(히스토리 포함)으로 표시되고 트리 충돌이 발생합니다.

    Foo.c는 수정됨으로 표시됩니다.

개발자 B는 이제 개발자 A의 재구성 방식에 따를지, 아니면 자신의 변경 사항을 새 구조의 해당 파일에 병합할지, 또는 단순히 A의 변경 사항을 되돌리고 로컬 파일을 유지할지 결정해야 합니다.

자신의 로컬 변경 사항을 재정렬된 파일과 병합하려면 개발자 B는 먼저 충돌 파일 Foo.c가 저장소에서 어떤 파일 이름으로 변경/이동되었는지 파악해야 합니다. 이는 로그 대화 상자를 사용하여 수행할 수 있습니다. 그런 다음 올바른 소스 파일을 표시하는 버튼을 사용하여 충돌을 해결하십시오.

개발자 B가 A의 변경 사항이 잘못되었다고 판단하면 충돌 편집기 대화 상자에서 해결됨으로 표시 버튼을 선택해야 합니다. 이는 충돌 파일/폴더를 해결됨으로 표시하지만, 개발자 A의 변경 사항은 수동으로 제거해야 합니다. 다시 로그 대화 상자가 무엇이 이동되었는지 추적하는 데 도움이 됩니다.

로컬 삭제, 업데이트 시 들어오는 삭제

  1. 개발자 A는 Foo.cBar.c로 이동하고 저장소에 커밋합니다.

  2. 개발자 B는 Foo.cBix.c로 이동합니다.

개발자 B의 작업 사본을 업데이트하면 트리 충돌이 발생합니다.

  • Bix.c는 히스토리와 함께 추가됨으로 표시됩니다.

  • Bar.c는 '정상' 상태로 작업 사본에 추가됩니다.

  • Foo.c는 삭제됨으로 표시되고 트리 충돌이 발생합니다.

이 충돌을 해결하려면 개발자 B는 충돌 파일 Foo.c가 저장소에서 어떤 파일 이름으로 변경/이동되었는지 파악해야 합니다. 이는 로그 대화 상자를 사용하여 수행할 수 있습니다.

그런 다음 개발자 B는 Foo.c의 새 파일 이름 중 어떤 것을 유지할지 결정해야 합니다. 개발자 A가 수행한 것인지, 아니면 본인이 수행한 이름 변경인지.

개발자 B가 충돌을 수동으로 해결한 후, 충돌 편집기 대화 상자의 버튼으로 트리 충돌을 해결됨으로 표시해야 합니다.

로컬 누락, 병합 시 들어오는 편집

  1. 트렁크에서 작업하는 개발자 A는 Foo.c를 수정하고 저장소에 커밋합니다.

  2. 브랜치에서 작업하는 개발자 B는 Foo.cBar.c로 이동하고 저장소에 커밋합니다.

개발자 A의 트렁크 변경 사항을 개발자 B의 브랜치 작업 사본으로 병합하면 트리 충돌이 발생합니다.

  • Bar.c는 이미 '정상' 상태로 작업 사본에 있습니다.

  • Foo.c는 트리 충돌과 함께 누락됨으로 표시됩니다.

이 충돌을 해결하려면 개발자 B는 충돌 편집기 대화 상자에서 해당 파일을 해결됨으로 표시해야 합니다. 그러면 충돌 목록에서 제거됩니다. 그런 다음 누락된 파일 Foo.c를 저장소에서 작업 사본으로 복사할지, 개발자 A의 Foo.c 변경 사항을 이름이 변경된 Bar.c로 병합할지, 또는 충돌을 해결됨으로 표시하고 아무것도 하지 않음으로써 변경 사항을 무시할지 결정해야 합니다.

누락된 파일을 저장소에서 복사한 다음 해결됨으로 표시하면 복사본이 다시 제거됩니다. 먼저 충돌을 해결해야 합니다.

로컬 편집, 병합 시 들어오는 삭제

  1. 트렁크에서 작업하는 개발자 A는 Foo.cBar.c로 이동하고 저장소에 커밋합니다.

  2. 브랜치에서 작업하는 개발자 B는 Foo.c를 수정하고 저장소에 커밋합니다.

  1. 트렁크에서 작업하는 개발자 A는 상위 폴더 FooFolderBarFolder로 이동하고 저장소에 커밋합니다.

  2. 브랜치에서 작업하는 개발자 B는 자신의 작업 사본에서 Foo.c를 수정합니다.

개발자 A의 트렁크 변경 사항을 개발자 B의 브랜치 작업 사본으로 병합하면 트리 충돌이 발생합니다.

  • Bar.c는 추가됨으로 표시됩니다.

  • Foo.c는 트리 충돌과 함께 수정됨으로 표시됩니다.

개발자 B는 이제 개발자 A의 재구성 방식에 따를지, 아니면 자신의 변경 사항을 새 구조의 해당 파일에 병합할지, 또는 단순히 A의 변경 사항을 되돌리고 로컬 파일을 유지할지 결정해야 합니다.

자신의 로컬 변경 사항을 재정렬된 파일과 병합하려면 개발자 B는 먼저 충돌 파일 Foo.c가 저장소에서 어떤 파일 이름으로 변경/이동되었는지 파악해야 합니다. 이는 병합 원본의 로그 대화 상자를 사용하여 수행할 수 있습니다. 충돌 편집기는 병합에 어떤 경로가 사용되었는지 알 수 없으므로 작업 사본에 대한 로그만 표시하므로, 직접 찾아야 합니다. 현재 이 프로세스를 자동화하거나 단순화할 방법이 없으므로 변경 사항은 수동으로 병합해야 합니다. 변경 사항이 포팅되면 충돌 경로는 중복되므로 삭제할 수 있습니다.

개발자 B가 A의 변경 사항이 잘못되었다고 판단하면 충돌 편집기 대화 상자에서 해결됨으로 표시 버튼을 선택해야 합니다. 이는 충돌 파일/폴더를 해결됨으로 표시하지만, 개발자 A의 변경 사항은 수동으로 제거해야 합니다. 다시 병합 원본의 로그 대화 상자가 무엇이 이동되었는지 추적하는 데 도움이 됩니다.

로컬 삭제, 병합 시 들어오는 삭제

  1. 트렁크에서 작업하는 개발자 A는 Foo.cBar.c로 이동하고 저장소에 커밋합니다.

  2. 브랜치에서 작업하는 개발자 B는 Foo.cBix.c로 이동하고 저장소에 커밋합니다.

개발자 A의 트렁크 변경 사항을 개발자 B의 브랜치 작업 사본으로 병합하면 트리 충돌이 발생합니다.

  • Bix.c는 정상(수정되지 않음) 상태로 표시됩니다.

  • Bar.c는 히스토리와 함께 추가됨으로 표시됩니다.

  • Foo.c는 누락됨으로 표시되고 트리 충돌이 발생합니다.

이 충돌을 해결하려면 개발자 B는 충돌 파일 Foo.c가 저장소에서 어떤 파일 이름으로 변경/이동되었는지 파악해야 합니다. 이는 병합 원본의 로그 대화 상자를 사용하여 수행할 수 있습니다.

그런 다음 개발자 B는 Foo.c의 새 파일 이름 중 어떤 것을 유지할지 결정해야 합니다. 개발자 A가 수행한 것인지, 아니면 본인이 수행한 이름 변경인지.

개발자 B가 충돌을 수동으로 해결한 후, 충돌 편집기 대화 상자의 버튼으로 트리 충돌을 해결됨으로 표시해야 합니다.

기타 트리 충돌

충돌이 파일이 아닌 폴더와 관련되어 있기 때문에 트리 충돌로 분류되는 다른 경우도 있습니다. 예를 들어, 트렁크와 브랜치 모두에 동일한 이름의 폴더를 추가한 다음 병합을 시도하면 트리 충돌이 발생합니다. 병합 대상의 폴더를 유지하려면 충돌을 해결됨으로 표시하기만 하면 됩니다. 병합 원본의 폴더를 사용하려면 먼저 대상의 폴더를 SVN 삭제한 다음 병합을 다시 실행해야 합니다. 더 복잡한 것이 필요한 경우 수동으로 해결해야 합니다.

TortoiseSVN 홈페이지

한국어 中文