이 문서는 전통적인 버전 제어 시스템에서 Git으로 전환해야하는 이유에 대한 정보를 공유하기 위해 작성되었다.
버전 제어란 무엇인가?
버전 제어 시스템(Version Control Systems)은 소프트웨어 개발팀이 개발 시간이 지남에 따라 발생되는 소스 코드의 변경사항을 관리하는데 도움을 주는 소프트웨어 도구이다. 버전 제어 소프트웨어는 특별한 종류의 데이터베이스에 소스코드의 모든 수정사항을 추적한다. 코드 개발에 실수가 발생했을때, 개발자는 이전 버전의 코드와 비교하여 실수를 수정함으로써 팀 구성원의 업무 중단을 최소화할 수 있다.
모든 소프트웨어 개발 프로젝트에서 소스 코드는 보호되어야 하는 귀중한 자산이다. 대부분의 소프트웨어 팀에서 소스 코드는 문제 해결을 위한 지식과 이해의 저장소로 개발자들의 노력을 통해 수집되고 정제된다. 버전 제어는 이러한 자산을 사람의 실수와 의도하지 않은 결과로인해 소스 코드를 보호한다.
버전 제어 시스템의 이점
버전 제어를 사용하지 않고 소프트웨어 개발은 하는 것은 백업이 없는 것처럼 위험하다. 버전 관리를 통해 개발자는 빠르게 개발을 하고 더 많은 개발자들이 합류할 때 효율성과 민첩성을 유지할 수 있게 해준다.
버전 제어 시스템은 지난 수십년간 큰 발전을 이루었다. 버전 제어 시스템은 소스 코드 관리(Source Code Management) 혹은 리비전 제어 시스템(Revision Control System)으로 불린다. 가장 인기 있는 버전 제어 시스템 중의 하나는 Git이다. Git은 분배된 버전 제어 시스템 중의 하나이다. 이러한 버전 제어 시스템에서 기대해야할 주요 이점은 다음과 같다.
- 모든 파일의 수정된 히스토리 확인
변경 내용에는 파일의 생성, 수정, 삭제를 포함한다. 이러한 기록에는 작성자, 날짜 및 변경의 목적에 대한 메모가 포함되어야 한다. 이러한 기록을 보유하면 버그에 대한 근본 원인 분석을 하는 데 도움이되며 이전 버전으로 돌아가 소프트웨어 문제를 해결할 수 있다. - 브랜칭과 머징
버전 제어 시스템에서 브랜치를 만들면 여러 작업 스트림을 서로 독립적으로 유지하면서 작업을 다시 머징할 수 있으므로 개발자는 각 브랜치의 변경 사항이 충돌하지 않는지 확인할 수 있다. 많은 소프트웨어 팀은 각 기능에 대해 분기를 수행하거나 릴리즈에 대해 분기를 수행하는 방식을 채택한다. - 추적성
소프트웨어에 대한 변경 사항을 추적하고 Jira와 같은 프로젝트 관리 소프트웨어와 연결함으로써, 변경 사항에 대한 내용 및 목적과 의도를 설명할 수 있다.
Git이란 무엇인가?
오늘날 전세계적으로 가장 많이 사용되는 버전 제어 시스템은 Git 이다. 오픈 소스 및 사용 프로젝트를 포함한 수 많은 프로젝트는 버전 제어를 위해 Git을 사용하고 있다. Git은 수 많은 개발자들이 이미 사용하고 있고 다양한 운영체제와 IDE에서 잘 작동한다.
Git은 분산 아키텍처이고 분산된 버전 제어 시스템(Distributed Version Control System)의 하나이다. SVN, CVS는 소프트웨어 전체 버전 히스토리를 하나의 저장소에 보관하지만 Git은 모든 변경 사항의 전체 기록이 개발자의 PC에 저장된다.
Git은 분산된 특징외에도 성능(Perfomance), 보안(Security), 유연성(Flexibility)에 맞게 설계되었다.
Performance
Git은 다른 버전 제어 시스템 보다 성능적인 특징이 매우 강하다. 새로운 변경 커밋, 브랜칭, 병합, 지난 버전과의 비교는 성능을 위해 최적화되어 있다. Git 내부에 구현된 알고리즘은 실제 소스 코드 파일 트리의 공통된 속성, 시간 경과에 따른 수정 방법 및 액세스 패턴에 관해 최적화 되어 있다.
일부 버전 제어 소프트웨어와 달리 Git은 파일 트리의 저장소 및 버전 기록이 무엇인지 결정할 때 파일 이름이 아니라 파일 컨텐츠에 중점을 둔다. 결국 소스코드 파일은 빈번하게 이름이 변경되고 분할되고 재배치 된다. Git 저장소 파일들의 객체 포멧은 델타 인코딩(내용 차이 저장), 압축 및 명시적으로 디렉토리 내용, 버전 메타 데이터 객체를 저장하는 조합을 사용한다.
분산되어 있어도 상당한 성능 이점을 얻을 수 있다.
Security
Git은 관리되는 소스 코드의 무결성을 최우선으로 설계되었다. Git 저장소에있는 파일, 디렉토리, 버전, 태그 및 커밋 사이의 관계뿐만 아니라 파일의 내용은 SHA1 보안 해싱 알고리즘으로 보호된다. 이러한 보호로 실수로 인한 변경이나 악의적인 변경으로부터 코드와 변경 기록을 보호하고 추적할 수 있다.
Git을 사용하면 소스 코드의 실제 내용을 확인할 수 있다.
다른 버전 제어 시스템은 비밀번호 변경에 대한 보호가 없으며 이는 소프트웨어 개발에 의존하는 조직에 심각한 정보 보안 취약점이 될 수 있다.
Flexibility
Git의 핵심 설계 목표 중 하나는 유연성이다. Git은 다양한 종류의 개발 워크플로우를 지원하고, 크고 작은 프로젝에서의 효율성과 많은 기존 시스템 및 프로토콜과의 호환성 측면에서 유연하다.
Git은 SVN과 달리 분기 및 태그 지정을 지원하고 분기 및 태그에 영향을 주는 작업은 변경 기록의 일부로 저장된다. 모든 버전 제어 시스템이 이러한 수준의 추적 기능을 제공하지 않는다.
버전 제어와 Git
Git은 오늘날 모든 소프트웨어 팀을 위해 베스트 초이스이다. 다음은 Git이 다른 버전 제어보다 선호되는 주된 이유를 보여준다.
Git is good
Git은 대부분의 팀과 개인 개발자가 필요로하는 기능, 성능, 보안 및 유연성을 가지고 있다.
Git은 사실 상 표준이다.
Git은 가장 널리 채택된 도구이다. 이것은 Git을 매력적으로 만든다.
많은 개발자들이 이미 Git 경험을 가지고 있으며, 대학 졸업생들 또한 Git을 사용할 줄 안다. 일부 조직에서는 다른 버전 제어 시스템에서 Git으로 마이그레이션 할 때 학습이 필요할 수 있지만, 향후 개발자 중 상당수는 Git에 대해 교육할 필요가 없을 것이다.
뿐만아니라 무수히 많은 제3자 소프트웨어 도구(IDE 포함)와 서비스는 이미 Git과 통합이 되어 있다.
Git은 품질 높은 오픈소스 프로젝트
Git은 10년이 넘게 매우 잘 지원되는 오픈 소스 프로젝트이다.
Git은 전세계 수많은 사용자 기반의 훌륭한 커뮤니티가 조성되어 있다. 그리고 책, 튜토리얼, 웹사이트에 훌륭한 문서들이 존재한다. 뿐만아니라 팟캐스트와 튜터리얼 비디오도 많다.
조직에서 Git을 도입해야하는 이유
개발자 입장에서 Git을 도입해야하는 다음과 같은 몇몇 이유가 있다.
기능(Feature) 브랜치 워크플로우
Git의 가장 큰 장점 중 하나는 브렌칭 능력이다. 중앙 집중식 버전 제어 시스템과 달리 Git 브랜치는 쉽게 만들고 쉽게 병합할 수 있다.
Feature 브랜치는 코드베이스를 위해 모든 변경을 위한 고립된 환경을 제공한다. 개발자가 개발 크기와 상관없이 작업을 시작하기를 원할 때 새로운 지점을 만들 수 있다. 따라서 마스터 분기에는 항상 출시할 수 있는 코드로 유지할 수 있다.
이러한 Feature 브랜치는 마스터의 코드를 직접 수정하는 것 보다 더욱 신뢰할 수 있으며 해당 브랜치와 개발 요구사항과 일치 시킬 수 있다.
분산 개발(Distributed Development)
SVN과 같은 단일 중앙 저장소에서 개발자는 하나의 중앙 저장소를 가리키는 워킹 카피를 가져온다. Git은 분산 버전 제어 시스템이기 때문에 워킹 카피 되신에 전체 커밋 히스토리를 가지고 있는 자신 소유의 로컬 저장소를 가지게 된다.
전체 커밋 히스토리를 가지고 있으면, 커밋을 하거나 파일의 이전 버전을 확인하거나 비교할때 네트워크 연결이 필요없기 때문에 속도가 빠르다.
만약 SVN과 같은 단일 중앙 저장소에서 어떤 개발자가 에러를 유발한 코드를 커밋하였다면 이 문제가 해결되기 전까지 다른 개발자는 코드를 가져올 수 없다. Git은 이러한 종류의 차단은 없으며 누구나 자신의 로컬 저장소에서 개발을 계속할 수 있다.
분산된 개발 환경은 안정적인 개발 환경을 만든다. 개발자가 자신의 저장소를 지우더라도 다른 누군가의 저장소를 복제해서 다시 시작할 수 있다.
Pull Requests
Pull Request는 다른 개발자에게 특정 지점(브랜치) 중 하나를 저장소에 병합하도록 요청하는 방법이다. 이를 통해 프로젝트 리더는 변경사항을 추적하는 것이 쉬워지며, 개발자는 통합을 위해 토론을 수행할 수 있다.
Pull Request를 통해 변경에 대한 주석 쓰레드를 확인할 수 있으며, 개발자가 어려운 문제를 겪을때 나머지 팀원에게 도움을 요청할 수 있다. 초급 개발자가 개발한 코드에 대해 코드 리뷰를 수행함으로써 마스터 분기에 안전한 코드를 유지할 수 있다.
커뮤니티
많은 사람들은 Git을 새로운 프로젝트의 예상 버전 제어 시스템으로 고려한다. Git을 이미 사용하고 있다면, 개발자는 이미 분산 개발에 친숙하기 때문에 새로운 워크플로우에 대한 교육은 생략할 수 있다.
추가적으로 Git은 매우 인기 있는 오픈 소스 프로젝트이다. 인터넷 상에 참조할 수 있는 무수히 많은 소스 코드가 Git을 통해 관리되고 있으며 이러한 코드를 내부 저장소에 쉽게 가져올 수 있다.
빠른 릴리즈 사이클
기능 브랜치, 분산 개발, Pull Requests, 방대한 커뮤니티의 궁극적인 결과는 빠른 릴리즈 사이클로 이어진다. 이러한 기능을 통해 개발자는 작은 변경을 자주 공유하고 애자일한 워크플로우를 용이하게 수행할 수 있다.
결과적으로 변경사항은 중앙 집중식 버전 제어 시스템에서 일반적으로 발생하는 단일 릴리즈보다 빠르게 배포 파이프 라인을 통해 배포될 수 있다.
Git은 CI(지속적인 통합)과 CD(지속적인 배포) 환경에서 잘 작동한다. Git hook은 Git 저장소 내부에 어떤 이벤트가 발생하였을때 스크립트를 수행하는 것을 허용하며 이는 수정된 컨텐츠를 자동으로 배포할 수 있게 해준다. 그리고 이는 특정 브랜치의 코드를 다른 서버에 구축 또는 배포할 수 있게 해준다.
예로 변경 사항이 발생할때 개발 브랜치의 코드를 테스트 서버로 배포할 수 있게 할 수 있으며, 이러한 종류의 빌드 자동화와 코드 리뷰를 결합하여 개발 단계에서 배포 단계로 넘어갈 때 코드에 대한 자신감을 최대화할 수 있다.
이 문서는 아래 문서의 내용을 저 맘데로 번역하였습니다.