본문 바로가기
Development/Git

Git 개념 알아보기

by 드로니뚜벅이 2022. 6. 18.

프로그래밍을 하다 보면 작성한 소스코드를 어떻게 관리하면 좋을지 많은 고민을 하게 됩니다. 저도 개발을 처음 시작할 때는 그날 그날 작업한 소스코드를 파일 혹은 폴더 단위로 날짜와 시간정보를 포함한 파일명으로 압축해서 관리했던 때가 있었던 것 같습니다.

그러다 회사 생활을 하게 되면서 CVS라는 툴을 알고 난 이후에는 소스에 대한 접근 방식이 완전히 180도로 바뀐 것 같습니다.

그 이후로 SVN이라는 툴도 꽤 인기몰이를 해서 오랫동안 사용하다가 지금은 똑똑한 리누스 토발즈 형님 덕분에 거의 모든 프로젝트에서 Git을 사용하고 있습니다. Git도 VCS(Version Control System) 중의 하나입니다.

이전의 서브버전(Subversion)이나 CVS가 중앙버전관리형(Centralized Version Control)이었다면 Git은 분산버전관리형(Distributed Version Control)으로 보셔야 합니다. 그래서 Git은 서버가 문제가 생기더라도 각 사용자의 로컬 저장소를 통해 소스를 관리할 수 있습니다.

출처: openhub (synopsys)

 

Git을 사용하기 위해서는 먼저 Git을 설치해야 합니다. 무료로 공식 사이트에서 운영체제별로 다운로드를 받으셔서 설치하실 수 있습니다. 이 곳에서는 한글로 잘 번역된 Git 사용 설명서도 있으니 시간 되시면 읽어 보세요.

여기서는 간단한 주요 명령어 중심으로만 설명하도록 하겠습니다.

 

공식 사이트: https://git-scm.com/

 

기본 용어

저장소(repository)

저장소는 파일이나 디렉토리를 저장하는 장소입니다. 변경 이력을 관리하고자 하는 디렉토리 등을 저장소의 관리하에 두는 것으로 그 디렉토리에 있는 파일 등의 변경 내역을 기록할 수 있습니다.

저장소는 자신의 작업 컴퓨터에 있는 "로컬 저장소"와 서버 등 네트워크에 있는 "원격 저장소"로 구분합니다. 원격 저장소에서 파일이나 프로젝트를 로컬 저장소에 다운로드 받아서 작업을 하고 작업된 결과물을 다시 원격 저장소에 저장합니다.

이름 실제 위치 설명
로컬 (Local)
= Working Directory
= Working Copy
프로젝트 폴더 현재 프로젝트 폴더에 존재하는 파일들 그 자체
인덱스 (Index)
= Staging Area
= Cache
프로젝트 폴더 하위
.git/index 파일
- 하나의 파일 인덱스(.git/index)로 존재
- 커밋을 실행하기 전의 저장소와 작업디렉토리 사이에 존재하는 공간으로 커밋이 이뤄질 준비가 된 파일의 내용들이 위치함
- 인덱스 파일에는 커밋이 이뤄질 준비가 된 파일의 내용들 각각에 대해 그 파일명과 해당 파일의 내용을 담고 있는 Blob 파일의 주소가 기록됨
저장소 (Repository) 프로젝트 폴더 하위
.git/objects/폴더
- 깃이 버전 관리를 위해 필요로 하는 데이터들을 저장하는 곳
- 버전관리를 시작한 시점부터 현재 시점까지 관리해 온 여러 버전들에 해당하는 파일들의 내용이 Blob 파일로서 이곳에 저장됨

 

브랜치(branch)

소프트웨어 개발은 현재 출시 하고 있는 버전의 유지 보수를 하면서 새로운 기능 추가 및 버그 수정을 할 수 있습니다. 이러한 병렬로 수행되는 여버 버전 관리를 위해 깃허브에는 브랜치라는 기능이 있습니다.

분기한 지점은 다른 지점의 영향을 받지 않기 때문에 같은 저장소에서 각 개발을 해 나갈 수 있습니다.

브랜치 종류로는 항상 유지되는 메인 브랜치(master, develop)와 일정 기간 동안에만 유지되는 보조 브랜치(feature,, release, hotfix)가 있다.

  • master - 제품으로 출시될 수 있는 브랜치
  • develop - 다음 출시 버전을 개발하는 브랜치
  • feature - 기능을 개발하는 브랜치
  • release - 출시 버전을 준비하는 브랜치
  • hotfix - 출시 버전에서 발생한 버그를 수정하는 브랜치

 

기본 동작 원리

저장소(Repository) 에서 파일 라이프 사이클

작업(Working) 디렉토리의 파일은 관리대상인 Tracked 상태와 와 관리대상이 아닌 Untracked 상태로 나뉩니다. add 명령어로 파일을 추가하면 Stage area에 올라가고 깃 데이터베이스에 파일이 등록이 됩니다. 스테이징 상태에서 커밋을 하면 Tracked 상태로 되며 관리대상이 됩니다. 즉, Tracked 상태인 파일은 저장소에 커밋을 한번이라도 수행한 파일을 의미합니다.

Git은 데이터를 변경 셋이나 경사(diff)으로 기록하지 않고 일냅샷으로 기록합니다

기본 동작 흐름

기본적으로 파일을 add 하여 파일을 Staging Area 에 올리면 ( .git 의 DB 에 등록 ) 아직 Modified/Unmodified 를 따지지 않습니다. 이후 Commit 하면 Revision 을 하나 만들어 로컬 저장소에 해당 스냅샷이 저장되고 파일은 Tracked / Unmodified 가 됩니다.