728x90
1. 버전 관리
1.1. 버전이란?
- 버전 : 이전과 약간씩 다른 변화들을 구분하는 표시
- 꼭 숫자만 사용해야 하는 것은 아님. (ex. 윈도우 XP)
- 서브 버전 : 버전과 버전 사이에 변화된 것
- 1.0 버전과 2.0 버전 사이에는 1.01, 1.02, 1.03 처럼 수많은 서브버전이 있다.
- 버전의 숫자나 기호 역시 일련의 규칙들이 있으며 버전을 부여하려면 소스 코드를 구별할 수 있는 의미있는 변화가 있어야 한다.
- 즉, 개발 도중 임시로 작업한 것을 버전이라고 말하지 않는다.
1.2. Why 버전관리?
- 프로그래밍은 컴퓨터 언어로 글을 작성하는 창작 활동이라고 할 수 있다.
- 프로그래밍 개발 과정은 수많은 코드를 변경하고 테스트하는 것이다. 따라서 지속적으로 변경되는 과정 속에서 코드는 잠시 불안정한 상태와 안정된 상태를 반복한다.
- 개발자는 안정된 상태의 코드와 불안정한 상태의 코드를 인지하고, 항상 안정된 상태를 유지하도록 노력해야 한다. 개발 또는 테스트 하는 과정에서 불안정한 코드가 있다면 계속 이어서 작업하기 불안하거나, 때에 따라 더 이상 작업하기 어려울 수도 있다. 이 때는 이전 상태로 돌아가 다시 시작할 수 있는 코드의 복귀(포인트) 지점이 필요하다.
- 이러한 코드 복귀 지점은 반드시 안정된 코드 상태를 기준으로 설정해야 하며 복귀 지점을 기록해두면 좀 더 자유롭고 안정적으로 개발할 수 있다.
2. 버전 관리 시스템
2.1 버전 관리 소프트웨어
- 버전 관리 시스템(VCS, Version Control System) : 코드와 콘텐츠의 변화를 관리하고 추적하는 소프트웨어
- 최조의 버전관리 시스템은 유닉스 환경에서 사용 가능한 SCCS(Source Code Control System)이다.
- SCCS는 1970년대 마크 로치킨드(Marc J. Rochkind)가 개발했으며, 이후 다양한 VCS 프로그램이 등장했다.
- 저장소(repository)(레포지터리) : VCS에서 버전들을 관리하고 저장하는 공간
2.2 버전 관리 소프트웨어(시스템)의 대표적 종류
1. 집중형
- 집중형 시스템은 말 그대로 모든 소스 코드가 한 곳에 집중되어 있는 형태이다.
- 하나의 메인 중앙 서버에서 개발 구성원의 모든 소스 코드를 통합적으로 관리한다.
- 클라이언트-서버 모델이라고 한다.
- 대표적인 집중형 관리 시스템(시대순) : SCCS, RCS, CVS, 서브버전
장점 | 저장소 하나를 중심으로 관리하기 때문에 시스템을 운영하기 수월하다. |
단점 | * 중앙 저장 공간인 서버에 문제가 생기면, 소스 코드가 있는 메인 저장소에 모든 개발자가 접근할 수 없는 심각한 상황이 발생할 수 있다. * 동시에 여러 개발자가 접근하면 충돌이 발생하기에 코드 수정을 안정적으로 할 수 있게 잠금 모델을 적용해야 한다. * 파일을 변경하려면 개발자들은 순서대로 대기하고 있어야 한다. |
2. 분산형
- 분산형 버전 관리 시스템(DVCS, Distributed Version Control System)은 집중형 시스템과 달리 저장소가 여러개 있다.
- 여러 저장소에 각 버전별 소스를 개별 보관한다.
- 분산 저장소는 P2P(Peer-to-Peer) 방식으로 공유하며, 각 개발자에게 공유 가능한 저장소 사본을 제공한다.
- 서버는 각 저장소 자료를 동기화하고 중개하는 역할만 수행한다.
- 대표적인 분산형 관리 시스템 : 깃(Git), 머큐리얼, 비트키퍼
장점 | 메인 서버에 문제가 생기더라도 지속적으로 개발할 수 있다. |
단점 | 익숙해지는데 시간이 걸리는 단점이 있다. |
3. 깃(Git)
3.1 깃(Git)이란?
- 2005년에 리눅스 개발자인 리누스 베네딕트 토르발스가 개발했다.
- 깃의 모든 소스는 깃허브에 공개되어 있다. ( https://github.com/git/git )
- 대표적인 분산형 버전 관리 시스템이다.
- 원격 저장소(remote repository)와 별개로 개발자 각각의 로컬 컴퓨터에 완벽한(원격 저장소의 내용과 동일한) 복제본 소스 코드를 저장할 수 있다. 이는 매번 중앙 저장소를 조회하지 않아도 개발을 진행할 수 있는 장점이 있다.
- 네트워크나 인터넷이 연결되어 있지 않은 상태에서도 로컬 컴퓨터의 소스 코드만으로 버전을 관리할 수 있다. 작업 후 나중에 인터넷에 연결되었을 때 동기화만 하면 된다.
- 원격 저장소로 많은 개발자의 저장소와 연결하거나 동기화 작업을 할 수 있다. 또 직접 만든 새로운 소스 코드를 배포하거나 내려받은 소스 코드를 수정한 후 다시 병합(merge)할 수 있다.
3.2 깃(Git) 의 특징
- 백업 기능
- 분산형 깃은 자신의 로컬 컴퓨터에서 독립적으로 소스의 버전 관리를 할 수 있다.
- 독립적이라는 것은 로컬 컴퓨터에서 자체적으로 버전을 기록하고 관리할 수 있는 시스템을 의미한다.
- 깃을 사용하면 코드를 원격 저장소에서 저장할 수 있다. 즉, 로컬 컴퓨터의 저장소를 동기화하여 원격 저장소에 백업할 수 있다.
- 사무실, 집 등 여러 공간에서 원격 저장소에 저장된 내용을 다시 내려받아 프로젝트 개발을 이어서 할 수 있다.
- 분산형 깃은 자신의 로컬 컴퓨터에서 독립적으로 소스의 버전 관리를 할 수 있다.
- 협업 개발
- 코드 공유
- 깃은 다수의 개발자와 코드를 공유하여 협업할 때 매우 유용하다.
- 예전에는 코드 공유를 위해 팀 내에서 외부 저장 장치를 이용하곤 했다. 이는 번거로운 작업이었는데 깃 덕분에 네트워크를 통해 코드를 좀 더 쉽게 공유할 수 있다.
- 책임과 기록
- 깃은 변경된 모든 이력을 저장한다.
- 누가 언제 어떤 파일을 수정했는지 기록하기 때문에 코드를 좀 더 책임감 있게 작성하고 유지할 수 있다.
- 깃은 커밋(commit)을 거쳐 모든 코드의 수정 이력을 기록한다. 이 때 깃의 커밋은 신중하게 작업해야 한다.
- 커밋으로 저장된 원본 객체는 수정할 수 없다.
- 원격 공유
- 분산된 여러 저장소 간에 정보를 주고 받으려면 중앙 서버가 필요하다. 이 때 깃에서는 원격 저장소가 중앙 서버 역할을 한다.
- 자신의 코드 저장소를 원격 서버에 푸시(push)하여 저장(동기화)할 수 있다.
- 또 다른 개발자의 소스를 원격 서버에서 풀(pull) 또는 페치(fetch)하여 언제든지 내려받을 수 있다.
- 이러한 특징을 이용해서 깃을 사용하면 개발 구성원 간에 소스 코드를 쉽게 주고받을 수 있다.
- 원격 저장소로 전송된 코드는 여러 개발자와 소스 코드를 공유한다.
- 협업하여 코드를 개발할 때 공유 기능은 매우 중요하다.
- 협업 개발
- 깃은 하나의 소스 코드를 여러 가지 브랜치로 분기하여 독립된 기능을 구현할 수 있다.
- 독립적으로 구현된 소스를 주고받으며, 필요하다면 각 브랜치를 하나로 병합할 수도 있다.
- 독립적으로 구현된 코드들을 수작업으로 병합하는 것은 어려운데, 깃에서는 다양한 병합 알고리즘을 제공하기 때문에 이를 이용하여 소스 코드의 충돌을 최소화하고 최종 코드를 쉽게 유지할 수 있다.
- 공개
- 원격 저장소를 사용하여 개발 중인 코드를 외부로 공개할 수 있다.
- 코드를 공개함으로써 내부 개발자가 만든 기능 한계를 극복하고 외부 개발자와 협업할 수 있다.
- 공개된 프로젝트는 많은 개발자 간의 협력으로 프로젝트를 빠르게 성장 및 발전시킬 수 있다.
- 외부 개발자는 원격 저장소를 포크(fork)하여 소스 코드의 버그를 수정하거나 기능을 개선할 수 있다. 수정한 소스 코드를 풀 리퀘스트(pull request)하여 기존 코드에 병합할 수도 있다.
- 코드 공유
3.3 깃의 동작 한눈에 보기
- 초기화: 폴더를 깃 저장소로 변경
- 커밋: 변경된 코드의 이력을 기록
- 브랜치: 분리 격리된 코드 이력을 기록
- 병합: 기존 이력과 분리된 이력을 통합
- 푸시: 로컬 저장소의 이력을 서버로 전송 및 공유
'Computer Science > Open Source' 카테고리의 다른 글
git 공부 내용 & 명령어 정리 (0) | 2024.06.13 |
---|---|
Open Source Software에 대해서 (0) | 2024.06.08 |