subversion과 git의 차이점

국물빌런·2020년 2월 2일
1

서브법전과 깃의 차이점을 이해하려면 버전관리의 역사부터 이해하는게 좋다.

버전관리 시스템이 나오기 전에는 파일, 디렉토리를 복사해서 버전을 관리하였다.
이런 방식은 굉장히 위험하고 비효율적인 방식이다.
실수로 파일을 지워버릴수도 있고 파일을 잘못 수정하거나 복사를 잘못 할 수도 있다.
이런 문제를 해결하기 위해 vcs라는것이 만들어졌다.

VCS : version control system

vcs가 버전관리 프로그램의 1세대이다.
파일들을 로컬 저장소에서 변경이력을 관리한다.
그러나 협업이 매우 힘들다는 단점을 가지고 있었다.
내가 VCS를 쓸 일은 없을것 같다.

image.png

CVCS : Centralized VCS

프로젝트를 진행할 때 다른 개발자와 함께 작업해야하는 경우 사용되는 시스템이다. 파일을 관리하는 서버가 별도로 있고 클라이언트가 중앙 서버에서 파일을 받아(Checkout) 사용할 수 있다.
관리자가 프로젝트에 참여한 사람 중 누가 무엇을 하는지 관리하기 쉽다. 하지만 중앙 서버에 문제가 발생하여 다운될 경우, 그동안에는 협업 및 백업이 불가능하다. 또한 하드디스크에 문제가 생긴다면 프로젝트의 모든 히스토리를 잃을 수도 있다.
대표적으로 subversion이 있다.

image.png

DVCS : Distributed VCS

클라이언트가 파일의 마지막 스냅샷을 가져오는 것이 아니라 저장소 자체를 복제하게 된다. 서버에 문제가 생길 경우 이 복제물로 작업이 가능하며 서버를 복원할 수도 있다. 또한 리모트 저장소가 존재하며 리모트 저장소가 많을 수도 있다. 즉, 동시에 다양한 그룹과 다양한 방법으로 협업이 가능하다.
대표적으로 현재 세상을 지배하고 있는 git이 있다.

image.png

자 이제 원래 알고자 했던 서브버전과 깃의 차이점을 알아보자.

  1. 중앙서버의 장애에 영향을 덜 받는다.
    일단 깃은 CVCS의 다음 세대인 DVCS인만큼 CVCS의 단점을 극복했다.
    위에서 말한 CVCS의 단점은 중앙 서버에 문제가 생기면 답이 없다는 것이다.
    단순히 네트워크의 문제라면 네트웍 장애 시간동안 체크아웃,로그확인,커밋등 대부분의 버전관리 명령어를 사용할 수 없다.
    그러나 깃은 중앙서버에서 단순히 파일을 체크아웃 받는 형태가 아니라
    중앙서버의 레포지터리 자체를 복사해온다.
    그래서 명령어도 git clone이다.
    즉 대부분의 명령어가 중앙서버가 아닌 로컬에서 이루어지며 중앙서버는 그저 백업용도에 가깝다.
    중앙서버에 문제가 생겨도 로그보기, 커밋, 머지등등 대부분의 깃 기능을 사용할 수 있으며 중앙서버자체가 날아가도 로컬서버의 레포지터리를 중앙서버로 역으로 clone하면 끝이다.
    또한 이런 방식으로 인하여 원격 저장소를 여러가지로 협업하면서 워크플로우를 구성하기가 훨씬 수월하다.
  1. 파일을 변경 목록이 아니라 스냅샷으로 관리한다.
    이게 서브버전을 사용하는 사용자에게는 조금 헷갈리는 부분이다.
    서브버전은 파일, 디렉토리 단위로 버전을 관리한다.
    즉 특정 버전의 파일 리스트를 가지는게 아니라 스냅샷을 찍어 버전을 판단한다.
    이건 깃의 아키텍쳐를 알아야 완전히 이해할 수 있을것 같다.

  2. 로컬 저장소를 가지기 때문에 훨씬 자유롭고 빠르다.
    로컬 저장소가 있다는 것은 커밋을 진짜 백업 용도로 해도 되고 다시 취소하기도 쉽다는것이다. 서브버전을 사용하면 팀프로젝트 진행시 아직 미완성인 부분을 커밋하기도 애매하며 명령어 하나하나가 중앙서버에 영향을 미치기 때문에 상당히 부담스러웠다. 로컬 저장소를 가짐으로써 자유로운 커밋과 네트워크를 타지 않기때문에 엄청난 성능의 진보를 이룩하였다.

  3. 브런치의 분기와 병합을 적극 지원한다.
    이것도 제대로 이해하려면 좀 더 구조를 알아야 할듯하다.
    일단 정말 강력하다고 생각한 부분이 브런치를 따도 디렉토리가 새로 생성되지 않는다.
    서브버전은 브런치를 새로 딴다는것은 디렉토리를 새로 생성한다는 의미였다.
    이것은 디렉토리의 이름을 더럽힌다. 즉 이름을 바꾸면서 관리하던때로 돌아간것이다.
    서브버전은 이 문제를 아주 잘 간파했다. 서브버전은 브런치를 따도 디렉토리 이름을 더럽히지 않는다. 브런치를 이동한다는것이 다른 디렉토리로 간다는 개념이 아니라 해당 브런치의 스냅샷으로 돌아간다는 개념에 가깝다.
    쉽게 말하면 알아서 이동하고자 하는 브런치의 파일로 변경된다.
    현재 회사의 서버에 디스크가 부족하다. 장비가 너무 오래되어서 디스크를 추가할 수도 없다. 현재 상황에서 굉장히 필요한 장점인듯하다. 또한 브런치를 만들기가 쉬우니 고객사별로 브런치를 다 새로 따도 된다. 용량문제도 발생하지 않으며 브런치 이름만 알면 힘들게 디렉토리를 찾아갈 필요도 없다.
    병합할때도 부담이 매우 적다. 일단 로컬에서 작업한다는것이 심리적으로 굉장한 안정감을 준다. 뭔가 잘못되면 날리고 원격저장소를 새로 clone를 하면 된다. 병합시 디렉토리도 알 필요 없으며 브런치 이름만 알면된다.

깃을 공부하면 할 수록 서브버전보다 진보되었다는 느낌을 많이 받는다.
서브버전 다음 세대인만큼 서브버전의 문제들을 많이 해결했기 때문이다.

profile
국물을 달라

0개의 댓글