첫 회사와 두 번째 회사에서 잠깐 svn을 사용하다 git으로 넘어가는 과정을 겪었는데 개인적으로 git을 선호하는 입장에서 왜 git이 아닌 svn을 사용했는지 궁금해졌습니다. 그저 오래된 프로젝트라서 svn을 사용해 왔거나 익숙해서 그랬을 가능성도 있지만 svn과 git은 용도가 다르다고 들었기 때문에 조사해 봤습니다.
해당 게시글에서는 svn과 git의 명령어보다 둘의 시스템적 차이점과 용도를 알아보겠습니다.
- 우선 svn은 Apache Subversion의 약자로 2000년에 기존 CVS(Concurrent Versions System)의 단점을 보완하기 위해 만들어졌다고 합니다. CVS는 1986년에 개발되었으며 자세한 사항은 홈페이지에 있습니다. https://savannah.nongnu.org/projects/cvs 참고로 가장 최근 뉴스는 2008년 게시글입니다. (svn은 GUI툴인 TortoiseSVN을 통해 간단하게 사용해 보았습니다.)
- git은 2005년에 Linus Torvalds가 Linux 커널 개발을 위한 분산 버전 관리 시스템을 개발하면서 만들어졌습니다. (저는 gitkraken과 git bash를 통해 사용하고 있는데 gitkraken의 경우 기능과 windows wsl 지원도 나쁘지 않고 잘 사용하고 있습니다. 다만 1년에 5만원 정도로 유료입니다.)
- svn : 중앙집중식 버전 관리
- snv은 공용 소스코드를 중앙 저장소에 보관하며 자신의 로컬 저장소를 가질 수 없습니다. git과 비교하자면 commit 명령어는 있어도 push명령어가 없는 것인데 이 때문에 작업 영역에서 commit 한 내용이 즉각적으로 같이 개발하고 있는 팀원들에게 영향을 미치게 됩니다.
- git: 분산 버전 관리
- git은 공용 소스코드를 관리하는 중앙 저장소가 존재하고, 그 중앙 저장소와 연결(복제)된 각 로컬 환경에 로컬 저장소가 존재하고 실제 작업하는 영역이 존재합니다. commit를 하면 나의 작업 영역에서 로컬 저장소로 commit 된 것이기 때문에 다른 팀원들에게 영향을 미치지 않습니다. (종종 commit만 하고 push를 까는 경우도 종종 생깁니다. 언제나 remote 브랜치와 로컬 브랜치의 위치에 주의하여 작업합시다.)
- 데이터를 파일 시스템에 저장합니다. (.git/)
- 브랜치의 생성과 병합, 이력 검색이 비교적 svn보다 직관적이며 편리합니다. 이 부분 때문에 많은 개발자들이 git을 선호합니다.
- 프로젝트에 맞는 버전관리 시스템
- svn
- 대형 프로젝트에서 복잡한 브랜치 관리가 필요 없고 개발 흐름이 간단한 경우 적합합니다.
- 작업 환경이 안정된 상태에서 추가 개발이 없는 프로젝트인데 이미 svn으로 작업되었으며, 팀이 git의 기능들을 학습하는 것에 어려움을 겪는다면 svn을 계속해서 사용하는 것이 더 좋아 보입니다.
- git
- 분산 환경(시간, 지역 등)에서 작업하는 것에 최적화되어있습니다.
- 브랜치와 병합 기능을 강력하게 지원하여 dev/qa/live/hot 등 다양한 버전으로 작업할 수 있고 각 환경마다 빠르게 적용할 수 있습니다. (저는 개인적으로 branch기능을 제외하고 cherry pick기능과 stash 기능을 가장 좋아합니다.)
- 대부분의 오픈 소스들이 git으로 작업되어 PR(pull request) 요청을 받기 때문에 오픈 소스로 작업할 예정이라면 git을 추천합니다.
- git은 팀 스타일에 따라 브랜치 관리 정책을 다양하게 펼칠 수 있습니다. 각 개발자의 취향을 존중할 수 있다는 점에서 git이 선호됩니다. (git-flow, github-flow 등 많은 정책들이 있지만 해당 정책들이 프로젝트의 성격에 잘 맞지 않거나 정책을 잘 지키지 않는다면 오히려 역효과를 가져올 수 있습니다. 저 또한 완벽하게 git-flow를 지켜서 개발한 경험은 없습니다. 그저 현재 진행하는 프로젝트에 잘 맞고 문제없이 매끄럽게 배포된다면 그것이 가장 좋은 정책이 아닐까 생각합니다. 결국 서비스 관리를 원활하게 하기 위한 도구일 뿐이니까요!)
- svn
- svn에서 꼭 git으로 변경해야 할까?
- 이것은 제 개인적인 생각이지만 경험상 이미 svn에 익숙해진 분들은 로컬 저장소라는 개념을 받아들이기까지 시행착오가 있고 그 시행착오에서 브랜치가 심하게 꼬여 코드가 상하는 경우가 많았습니다. 때문에 git에 익숙하여 다른 분들을 가르치거나 해당 과정을 인내심 있게 풀어나갈 수 있는 시간, 인적 자원이 있는 상태가 아니라면 무리하게 git으로 변경하는 것은 오히려 마이너스 효과가 생길 수 있습니다. git의 장점을 잘 이용할 것이 아니라면 자신의 프로젝트 팀에 맞춰 효율적인 버전관리 시스템을 선택하는 것이 중요합니다. 위 git 정책에서 이미 언급했지만 중요한 것은 제대로 된 서비스의 관리와 배포이고 git은 그것을 원활하게 하기 위한 도구이기 때문에 svn이든 git이든 서비스에 맞는 버전관리 시스템으로 원활한 개발환경을 이루길 바라겠습니다.
스스로 아직 git을 활용하는데 부족함이 있다고 생각하지만 조금 더 git을 이해할 수 있던 시간이었습니다.