01 버전관리 시스템(형상관리)
- Configuration Management Systems
- Version Control Systems
- Source Data + History
- 협업, 작업추적, 복구 등이 가능
02 Git 등장 배경
- Source Folder + 실행파일을 버전별로 카피하여 관리
- 하루종일 개발한 코드가 컴퓨터가 다운 되면서 날아가버림
- 그래서 파일의 버전을 관리하기 위하여
[Local Version Control Systems]
- 내 컴퓨터에서 버전 관리 가능 → 내 컴퓨터 하드가 날아가면 전체 코드 사라짐
- 버전은 관리되지만, 협업은 여전히 어려움
- 그래서 중앙에서 관리
[Centralized Version Control Systems]
- 협업이 가능해짐
- commit 하는 순간 배포되어 다수에게 버그 유발 가능 (서버로 바로 commit)
- 인터넷이 안되면 작업이 불가능
- 자신만의 version history를 가질 수 없음
- 그래서 개발되었다
03 버전관리 시스템의 종류
- CVCS - CVS, SVN, etc., - DVCS - Mercurial, Git, etc.,
[CVS]
- 1980년대 만들어진 형상관리 시스템
- commit 중 오류 발생 시 Rollback 이 되지 않는 등의 문제
- 이후 SVN 으로 대체됨
[SVN]
- https://subversion.apache.org/
- 2000년대 만들어졌고, 현재까지 두루 사용 중
[Git]
- https://git-scm.com/
- SVN 보다 빠른 속도와 많은 기능을 지원
- 현재 많은 기업이 사용 중
[요즘 기업들은]
- 대부분 SVN 혹은 Git 사용 중
04 Git 기반의 서비스
[Github]
- https://github.com
- Git 을 호스팅 해주는 웹 서비스, 협업을 위한 기능을 제공
- 참고 - 소스코드 보안이 중요한 경우 사용을 기피함
[Gitlab]
- https://gitlab.com
- 설치형 버전관리 시스템 - 소스코드 보안이 중요한 기업에서 주로 사용
- 클라우드 버전 관리 시스템 - 10명 이하 무료 (Github 와 유사)
- Issue tracker, Git Remote Repository, API, Team, Group 기능 제공
Installing on Windows
- [Git 설치 확인]
프로그램 목록에 Git 관련 앱이 존재하거나 검색된다면 설치 Pass
- [Git Download]
git-scm.com/download/win
- [Git 설치]
다운로드 받은 실행파일 (Git-2.33.1-64bit.exe)을 더블클릭
- Git 라이센스 정책 확인 > Next 클릭
- Git 이 설치될 경로 확인 > Next 클릭
- 설치할 구성요소 선택 > 기본 선택 상태 그대로 Next 클릭
- 시작 폴더 경로 선택 > Next 클릭
- Git 이 사용할 기본 에디터 선택 (Vim) > Next 클릭
- Git Default Branch 명명 규칙 > Next 클릭
- 환경변수 변수 PATH 설정 > Next 클릭
- OpenSSH 옵션 선택 > Next 클릭
- HTTPS 전송방식 선택 (OpenSSL 인증) > Next 클릭
- Commit, Checkout 줄바꿈 스타일 선택 > Next 클릭
- Terminal Emulator 설정 > Next 클릭
- Git Pull 작업 방식 선택 > Next 클릭
- 신용관리방법 선택 > Next 클릭
- 기타 옵션 (메모리에 캐싱) > Next 클릭
- 새로 개발중인 옵션들 > Next 클릭
- 설치 완료 > Finish 선택
- [Git 설치 확인]
시작메뉴 > Git > Git Bash 실행
GitHub 가입
- GitHub 사이트
https://github.com
- Git 에서 사용할 email 주소 > continue
- Password > continue
- Username > continue
- Create Account
- Mail 확인 후 Code 입력
- Welcome > Just me, Student > Continue
- Collaborative coding > Continue
- Skip personalization
- Git 가입 확인
Git Global Configuration
- [Global Username & Email]
- Global Username & Email - 예제
- [CRLF - Windows]
Windows - 가져올 때는 LF 를 CRLF 로 변경하고 보낼때는 CRLF 를 LF 로 변경
- [CRLF - Mac]
Mac - LF 만 사용
[참고 - Line ending]- Windows : CR (\r) + LF (\n) - Unix or Mac : LF (\n) - Windows 사용자와 Mac 사용자가 같은 Git Repository 를 작업할 때 코드에서 변경된 내용이 없어도 CRLF 차이로 인해 commit 이 발생할 수 있음
- [Editor]
- Editor - 예제
- [전체 설정 확인]
- 전체 설정 확인 - 예제
- [항목별 설정 확인]
- 항목별 설정 확인 - 예제
Git 기본 용어
- [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 를 진행 할 수 있음
Local Repository 구성
- Local Repository 는 Git 이 관리하는 3가지 단계로 구성되어 있음
- Working Directory (작업공간) - 실제 소스 파일, 생성한 파일들이 존재 - Index (Stage) - Staging area (준비영역) 의 역할, git add 한 파일들이 존재 - HEAD - 최종 확정본, git commit 한 파일들이 존재
Local Repository 생성
- [Workspace 생성]
- [Working Directory 생성]
Workspace 로 이동한 뒤 Working Directory 생성
- [Git init]
폴더에서 Git 을 초기화하는 명령어를 사용하면 해당 폴더를 Git 이 관리하기 시작
- 실습
생성한 폴더로 이동하여 Git init 을 실행하면 Repository 가 생성됨
- [.git 확인]
git 폴더가 생성된 것을 확인 → .git 으로 이동해서 파일을 살펴보면 Git 관련 파일들이 생성된 것을 확인
- [파일 생성]
- Working Directory 에 파일을 생성 - 참고> touch 명령어 - 빈 파일을 생성
- [Git Status]
Git 에 존재하는 파일 확인
- [Git Add]
Working Directory 에서 변경된 파일을 Index (stage)에 추가
- 실습
- [Git Commit]
Index (stage) 에 추가된 변경사항을 HEAD 에 반영 (확정)
- 실습
Remote Repository 생성
- Create respository 버튼 클릭
- 프로젝트 이름을 설정한 뒤 빈 프로젝트 상태로 > Create repository 클릭
- Remote Repository 생성 확인
- Github Token 생성
얼마전부터 보안상의 이유로 Remote Repository 접속 시 비밀번호 대신 Token 을 사용
- 사용자 메뉴에서 Settings 선택
- Developer settings 선택
- Personal access tokens 선택
- Generate new token 선택
- Token 이름 입력 + No expiration 을 선택 + repo 선택 > Generate token 버튼 선택 (그림 다음 장)
- Token 생성 완료 - 이후에는 Token 값이 보이지 않으므로 반드시 잘 복사해두세요
Remote Repository 등록
Local Repository 에 연동할 Remote Repository 를 등록 (Token 사용)
- [Remote Repository 주소 확인]
왼쪽 상단 고양이를 눌러서 GitHub Home 으로 이동 > 생성해둔 Remote Repository 선택
- HTTPS 선택 확인 > 주소 복사
- [Local Repository 에 Remote Repository 등록]
Remote Repository 등록
- Remote Repository 등록 with Username and Token
- 실습
- Remote Repository 정보 확인
- 실습
Remote Repository 에 변경내용
Push 하기Local Repository (HEAD) 에 반영된 변경내용을 Remote Repository 에도 반영하기 위해서는 Git Push 를 사용
- [Git Push]
- 실습
- [Remote Repository 확인]
Remote Repository 페이지에서 새로고침 하면 Push 된 파일이 보임
Remote Repository 에 Pull 하기
Remote Repository 의 내용에 맞춰 Local Repository 를 갱신하려면 Git Pull 사용
- [ReadMe 파일 생성]
Add a README 버튼 클릭
- 내용 확인 (모두 Default 설정으로)
- 하단의 Commit new file 버튼 선택
- README 파일 생성 확인
- [Git Pull]
- 실습
새로운 Git 계정을 만들어서 사용해 보고 Git bash를 처음 사용해 본 것이 가장 기억에 남는다
복잡한 부분은 특별히 없었다
그러나 push와 pull이 조금 생소해서 아직은 잘 이해가 가지 않는다
이제 막 Git 과정을 들어왔고 완전히 다른 개념으로 시작하는 새로운 과정이라서 아직은 뭐가 뭔지 잘 모르겠다
내일은 다음 Git 파트를 수강할 예정이다