서브법전과 깃의 차이점을 이해하려면 버전관리의 역사부터 이해하는게 좋다.
버전관리 시스템이 나오기 전에는 파일, 디렉토리를 복사해서 버전을 관리하였다.
이런 방식은 굉장히 위험하고 비효율적인 방식이다.
실수로 파일을 지워버릴수도 있고 파일을 잘못 수정하거나 복사를 잘못 할 수도 있다.
이런 문제를 해결하기 위해 vcs라는것이 만들어졌다.
vcs가 버전관리 프로그램의 1세대이다.
파일들을 로컬 저장소에서 변경이력을 관리한다.
그러나 협업이 매우 힘들다는 단점을 가지고 있었다.
내가 VCS를 쓸 일은 없을것 같다.
프로젝트를 진행할 때 다른 개발자와 함께 작업해야하는 경우 사용되는 시스템이다. 파일을 관리하는 서버가 별도로 있고 클라이언트가 중앙 서버에서 파일을 받아(Checkout) 사용할 수 있다.
관리자가 프로젝트에 참여한 사람 중 누가 무엇을 하는지 관리하기 쉽다. 하지만 중앙 서버에 문제가 발생하여 다운될 경우, 그동안에는 협업 및 백업이 불가능하다. 또한 하드디스크에 문제가 생긴다면 프로젝트의 모든 히스토리를 잃을 수도 있다.
대표적으로 subversion
이 있다.
클라이언트가 파일의 마지막 스냅샷을 가져오는 것이 아니라 저장소 자체를 복제하게 된다. 서버에 문제가 생길 경우 이 복제물로 작업이 가능하며 서버를 복원할 수도 있다. 또한 리모트 저장소가 존재하며 리모트 저장소가 많을 수도 있다. 즉, 동시에 다양한 그룹과 다양한 방법으로 협업이 가능하다.
대표적으로 현재 세상을 지배하고 있는 git
이 있다.
자 이제 원래 알고자 했던 서브버전과 깃의 차이점을 알아보자.
파일을 변경 목록이 아니라 스냅샷으로 관리한다.
이게 서브버전을 사용하는 사용자에게는 조금 헷갈리는 부분이다.
서브버전은 파일, 디렉토리 단위로 버전을 관리한다.
즉 특정 버전의 파일 리스트를 가지는게 아니라 스냅샷을 찍어 버전을 판단한다.
이건 깃의 아키텍쳐를 알아야 완전히 이해할 수 있을것 같다.
로컬 저장소를 가지기 때문에 훨씬 자유롭고 빠르다.
로컬 저장소가 있다는 것은 커밋을 진짜 백업 용도로 해도 되고 다시 취소하기도 쉽다는것이다. 서브버전을 사용하면 팀프로젝트 진행시 아직 미완성인 부분을 커밋하기도 애매하며 명령어 하나하나가 중앙서버에 영향을 미치기 때문에 상당히 부담스러웠다. 로컬 저장소를 가짐으로써 자유로운 커밋과 네트워크를 타지 않기때문에 엄청난 성능의 진보를 이룩하였다.
브런치의 분기와 병합을 적극 지원한다.
이것도 제대로 이해하려면 좀 더 구조를 알아야 할듯하다.
일단 정말 강력하다고 생각한 부분이 브런치를 따도 디렉토리가 새로 생성되지 않는다.
서브버전은 브런치를 새로 딴다는것은 디렉토리를 새로 생성한다는 의미였다.
이것은 디렉토리의 이름을 더럽힌다. 즉 이름을 바꾸면서 관리하던때로 돌아간것이다.
서브버전은 이 문제를 아주 잘 간파했다. 서브버전은 브런치를 따도 디렉토리 이름을 더럽히지 않는다. 브런치를 이동한다는것이 다른 디렉토리로 간다는 개념이 아니라 해당 브런치의 스냅샷으로 돌아간다는 개념에 가깝다.
쉽게 말하면 알아서 이동하고자 하는 브런치의 파일로 변경된다.
현재 회사의 서버에 디스크가 부족하다. 장비가 너무 오래되어서 디스크를 추가할 수도 없다. 현재 상황에서 굉장히 필요한 장점인듯하다. 또한 브런치를 만들기가 쉬우니 고객사별로 브런치를 다 새로 따도 된다. 용량문제도 발생하지 않으며 브런치 이름만 알면 힘들게 디렉토리를 찾아갈 필요도 없다.
병합할때도 부담이 매우 적다. 일단 로컬에서 작업한다는것이 심리적으로 굉장한 안정감을 준다. 뭔가 잘못되면 날리고 원격저장소를 새로 clone를 하면 된다. 병합시 디렉토리도 알 필요 없으며 브런치 이름만 알면된다.
깃을 공부하면 할 수록 서브버전보다 진보되었다는 느낌을 많이 받는다.
서브버전 다음 세대인만큼 서브버전의 문제들을 많이 해결했기 때문이다.