Git의 기본 용어 Repository, Checkout, Working Directory, Staging Area, git directory, Commit, Tag, Push, Pull, Branch, Merge 등에 대해 알아봅니다.
Repository (저장소)
Checkout
- Checkout 대상: Branch, Commit, Tag
- 특정 Commit이나 Tag, Branch 등의 소스코드로 이동하는 것.
- Checkout 을 통해 과거의 여러 시점의 코드로 이동이 가능.
- Branch 생성 및 삭제, 수정 등 다양한 작업에 활용.
The Three States
Modified
- 수정한 파일을 아직 로컬 데이터베이스에 commit 하지 않은 상태.
Staged
- 현재 버전에서 수정한 파일을 곧 Commit 할 것이라고 표시한 상태.
Committed
- 데이터가 로컬 데이터베이스에 안전하게 저장된 상태.
The Three Main Sections
[사진 출처: Git 공식 웹사이트 (링크)]
Working Directory
- 작업을 수행하기 위한 Directory, 즉, 일반적인 Local PC의 저장 경로.
- Repository에서 특정 버전을 사용 혹은 수정하기 위해 Checkout 하여 저장하는 경로.
- Repository에 commit 하기 위한 파일을 처음 생성 혹은 수정하는 공간.
Staging Area
- commit 할 내용이 올라가는 임시 저장 영역.
- Staging Area에서 commit에 반영할 파일만 선별하여 commit 진행.
- Git의 기술적 용어로 "index"라고도 부름.
.git directory (Repository)
- commit 된 파일들이 저장되는 공간. (Local Repository)
- 파일의 수정사항, 즉, 각 버전에 대한 Snapshot을 저장.
- Push를 하면 이 Local Repository에서 Remote Repository로 전송.
Git workflow
-
Working Directory에서 파일을 생성 혹은 .git directory에서 Checkout 한 파일을 수정(Modify).
-
수정된(Modified) 파일을 commit 하기 위해 Staged 상태를 만들어 Staging Area에 임시 저장.
-
commit 하면 Staging Area에서 선별된 파일들이 .git directory에 저장되어 commited 상태가 되며, 파일의 수정사항에 대한 Snapshot을 영구적으로 .git directory에 보관.
Commit
- Staging Area에서 선별된 작업 내용을 Local Repository에 저장하는 과정.(버전을 생성하는 행위)
- 각각의 commit 은 유의미한 변경 단위이며 commit log에 변경 사항에 대한 설명을 작성해 같이 저장 가능.
- 참고 사항: commit 단위나 commit log format 을 정해두는 기업이나 팀도 있음. (빌드 서버를 사용하는 경우)
- 권장 사항: (기업이나 팀의 규정 내에서) commit을 아낌없이 자주 하자. 게임 save point 남기듯 남겨주는 것이 좋다.
Tag
- 특정 commit에 쉽게 접근할 수 있도록 붙여놓은 이정표.
- Tag 가 붙은 commit 은 commit id (version) 대신 tag name으로 쉽게 checkout 가능.
Push
- Local Repository의 내용 중, Remote Repository에 반영되지 않은 commit 을
Remote Repository로 보내는 과정.
- 주의 사항: Local Repository에서의 commit 과는 달리, 중앙 서버에 저장 시키는 것이기 때문에 협업 중인 다른 개발자들이 해당 파일에서 작업하게 되어 영향을 받을 수 있음. 검증되지 않은 코드는 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를 진행할 수 있음.