버전 관리
버전관리 시스템(형상관리)
- Configuration Management Systems
- Versino Control Systems
버전관리를 하는 이유
- Source Data + History
- 협업, 작업추적, 복구 등이 가능
Git 등장 배경
기존 방식
- Source Folder + 실행파일을 버전별로 카피하여 관리
- '진짜마지막파일', '진짜진짜마지막파일', ...
Local Version Control Systems
- 내 컴퓨터에서 버전 관리 가능 -> 내 컴퓨터 하드가 날아가면 전체 코드 사라짐
- 버전은 관리되지만, 협업은 여전히 어려움
- 그래서 중앙에서 관리해보자!
Centralized Version Control Systems
- 협업이 가능해짐
- Commit 하는 순간 배포되어 다수에게 버그 유발 가능(서버로 바로 commit)
- 인터넷이 안되면 작업이 불가능
- 자신만의 version history를 가질 수 없음
- 그래서 개발된..
Distributed Version Control Systems
- commit 하더라도 개인저장소 내에 적용됨(다른 개발자에게 영향 없음)
- 원하는 순간에 배포(Push) 가능
- 오프라인에서도 작업 가능
- 자신만의 version history를 가짐
버전관리 시스템의 종류
종류
- CVCS: CVS, SVN, etc
- DVCS: Mercurial, Git, etc
CVS
- 1980년대 만들어진 형상관리 시스템
- commit 중 오류 발생 시 rollback이 되지 않는 등의 문제
- 이후 SVN으로 대체
SVN
Git
- SVN보다 빠른 속도와 많은 기능 지원
- 현재 많은 기업이 사용 중
기본 용어
Repository
- 소스코드가 저장되어 있는 여러 개의 Branch가 모여있는 디스크상의 물리적 공간
- Local Repository와 Remote Repository로 구분
Checkout
- 특정시점이나 Branch의 소스코드로 이동하는 것을 의미
- Checkout 대상 - Branch, Commit, Tag
- Checkout 을 통해 과거 여러 시점의 코드로 이동이 가능
Stage
- 작업할 내용이 올라가는 임시저장영역
- 이 영역을 이용하여 작업한 내용 중 commit에 반영할 파일만 선별하여 commit을 수행할 수 있음
Commit
- 작업할 내용을 Local Repository에 저장하는 과정
- 각각의 commit은 의미있는 변경단위이고, 변경에 대한 설명을 commit log로 남김
- commit은 아끼지 말자
Tag
- 임의의 commit 위치에 쉽게 찾아갈 수 있도록 붙여놓은 이정표
- Tag가 붙은 commit은 commit id (version) 대신 tag name으로 쉽게 check out 가능
Push
- Local Repository의 내용 중, Remote Repository에 반영되지 않은 commit을 Remote Repository로 보내는 과정
- push하는 순간 다른 개발자들도 영향을 받기 때문에 검증되지 않은 코드는 push하지 않도록 함
Pull
- Remote Repository에 있는 내용 중, Local Repository에 반영되지 않은 내용을 가져와서 Local Repository에 저장하는 과정
- 다른 팀원이 변경하고 Push 한 내용을 Local Repository에 가져올 수 있음
- Push 과정에서 Conflict(충돌)이 일어나서 Push가 거절된 경우, Pull을 통해 Remote Repository의 변경 내용을 Local Repository에 반영하여 Conflict를 해결한뒤 다시 Push를 시도 해야 함
Branch
- 특정 시점(commit 단위)에서 분기하여 새로운 commit을 쌓을 수 있는 가지를 만드는 것
- 개발의 주축이 되는 branch를 master branch( 혹은 main branch)라고 함
- 모든 branch는 최종적으로 다시 master branch에 merge(병합)되는 형식으로 진행됨
Merge
- Branch의 반대 개념으로 하나의 Branch를 다른 Branch와 합치는 과정
- Merge 되는 두 Branch는 주종관계가 성립
- Merge되는 과정에서 충돌이 발생하는 경우 Diff를 수정하여 Conflict를 해결한 뒤 Merge를 진행할 수 있음