버전관리 시스템( = 형상관리 툴 )
• Configuration Management Systems
• Version Control Systems (VCS)
버전관리 하는 이유
• Source Data + History
• 협업, 작업추적, 복구 등이 가능
Distributed Version Control Systems(DVCS)
• commit 하더라도 개인저장소 내에 적용됨 (다른 개발자에게 영향 없음)
• 원하는 순간에 배포(Push) 가능
• 오프라인에서도 작업 가능
• 자신만의 version history를 가짐
Git
• https://git-scm.com/
• SVN 보다 빠른 속도와 많은 기능을 지원
• 현재 많은 기업이 사용 중
Github
• https://github.com
• Git 을 호스팅 해주는 웹 서비스, 협업을 위한 기능을 제공
• 참고 - 소스코드 보안이 중요한 경우 사용을 기피함
Gitlab
• https://gitlab.com
• 설치형 버전관리 시스템 - 소스코드 보안이 중요한 기업에서 주로 사용
• 클라우드 버전 관리 시스템 - 10명 이하 무료 (Github 와 유사)
• Issue tracker, Git Remote Repository, API, Team, Group 기능 제공
git config --global user.name <username>
git config --global user.email <email>
git config --global core.autocrlf true # Window : 가져올때는 LF->CRLF, 보낼때는 CRLF->LF
# 전체설정 확인
git config --list
# 항목별 설정 확인
git config user.name
git config user.email
Repository
• 소스코드가 저장되어 있는 여러 개의 Branch 가 모여있는 디스크상의 물리적 공간
(프로젝트 단위의 여러 소스코드가 모여있는 공간)
• Local Repository 와 Remote Repository 로 구분
(서버에도 있고, 로컬에도 있음)
Checkout
• 특정 시점이나 Branch 의 소스코드로 이동하는 것을 의미
• Checkout 대상 - Branch, Commit, Tag
• Checkout 을 통해 과거 여러 시점의 코드로 이동이 가능
Stage
• 작업할 내용이 올라가는 임시저장영역
• 이 영역을 이용하여 작업한 내용중 commit 에 반영할 파일만 선별하여 commit 을 수행할 수 있음
Commit
• 작업할 내용을 Local Repository 에 저장하는 과정
• 각각의 commit 은 의미있는 변경단위이고, 변경에 대한 설명을 commit log 로 남김
• 권장 - commit 을 아끼지 마세요. (게임의 save point, 아끼면 똥됩니다.)
• 참고 - commit 단위나 commit log format 을 정해놓은 회사나 팀도 있음 (빌드 서버를 사용하는 경우)
Tag
• 임의의 commit 위치에 쉽게 찾아갈 수 있도록 붙여놓은 이정표
• Tag 가 붙은 commit 은 commit id (version) 대신 tag name 으로 쉽게 checkout 가능
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 는 주종관계가 성립. 예 - dev branch 를 main branch 에 merge
• Merge 되는 과정에서 Confict (충돌) 이 발생하는 경우
Diff 를 수정하여 Conflict 를 해결한 뒤 Merge 를 진행 할 수 있음