Git은 빠르고 효율적인 버전 관리 시스템(Version Control System, VCS)으로, 소프트웨어 개발에 있어 필수적인 도구입니다. Git을 제대로 활용하려면 Git 개념과 원리를 이해하는 것이 중요합니다. 그래서 첫 번째 글에서는 Git 개념과 원리에 대해서 자세히 알아보도록 하겠습니다.
Git 소개
Git 공식 홈페이지에서는 Git을 다음과 같이 설명하고 있습니다.
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
Git은 분산된 버전 관리 시스템입니다. 여기서 분산의 의미는 하나의 원격 저장소(remote repository)를 사용하여 버전을 관리하는 것이 아니라 원격 저장소와 로컬 저장소(local repository)를 함께 사용하여 버전을 관리하는 방식을 의미합니다.
이 방식으로 Git은 다른 형상 관리에 비해 속도가 빠르고, 장애 복구에 유리하며 협업 작업에 적합합니다.
버전 관리란?
문서 작업 시 혹시 모를 사태를 대비해 아래 그림과 같이 날짜 또는 버전 등 시점에 따라서 파일을 백업하고 저장한 경험이 있을 것입니다. 이와 같이 사용자가 원하는 시점에 파일을 기록하고 원하는 버전으로 복원할 수 있게 하는 것을 버전 관리라고 하고, 이를 편리하게 관리해주는 시스템을 버전 관리 시스템이라고 합니다.
즉, 버전 관리는 파일의 변경 이력을 기록하고 원하는 시점으로 되돌릴 수 있는 시스템이라고 할 수 있습니다.
일반적으로 버전 관리 시스템의 주요 기능은 다음과 같습니다.
- 변경 기록 : 파일 추가, 수정, 삭제 등의 변경 이력을 저장합니다.
- 변경 내용 비교 : 이전 버전과 비교해 어떤 부분이 수정되었는지 확인할 수 있습니다.
- 복원 : 특정 시점의 버전으로 파일을 되돌릴 수 있습니다.
- 변경 사유 기록 : 변경 이유를 저장해 추후 추적 및 협업이 용이합니다.
Git 원리
Git 버전 관리 이해하기
Git은 스냅샷(Snapshot) 개념을 사용해 파일의 상태를 저장합니다. 각 스냅샷은 고유한 해시값으로 구분되며, 변경된 데이터만 기록해 효율성을 극대화 합니다.
위 내용을 그림을 통해 간단하게 알아보겠습니다.
사용자가 작업 폴더에 흰색 배경 원을 그립니다. 작업 폴더에 흰색 배경의 원을 그렸을 뿐 아직 저장소에 기록하지 않았기에 저장소에는 아무것도 없습니다.
흰색 배경 원을 저장소에 기록합니다.
기존 흰색 배경 원을 파란색 배경 원으로 변경하고 저장소에 기록합니다. 그리고 파란색 배경 원을 녹색 배경 원으로 변경하고 저장소에 기록합니다.
기록한 순서대로 흰색 배경 원, 파란색 배경 원, 녹색 배경 원으로 저장됩니다.
각 노드는 내부적으로 고유한 해쉬 값을 가지고 있으며, 기록한 순서를 보장하기 위해 부모 노드를 지정하여 관리합니다.
이렇게 여러 노드가 저장소에 존재하게 되며 사용자는 원하는 노드를 선택하여 해당 버전으로 파일을 변경합니다.
만약 파란색 배경 원으로 작업 폴더를 변경하고 싶다면 D9CAF 노드를 참조하여 다시 가져오면 됩니다.
파란색 배경 원으로 변경한 상태에서 파란색 배경 원을 빨간색 배경 원으로 변경하고 저장소에 기록하면 기존 녹색 원을 없애고 새롭게 빨간 배경 원을 생성하거나 녹색 배경 원을 그대로 두고 빨간색 배경 원을 생성할 수 있습니다.
Git을 사용하는 이유
Git을 사용하는 이유는 동일한 프로젝트에서 여러 개발자들이 협업하기 매우 편하기 때문입니다. 버전 관리 기능을 포함하여 Git의 대표적인 기능은 다음과 같습니다.
- (동시성) 소스 코드를 주고 받을 필요 없이 여러 개발자들이 동시에 개발 가능함
- (가역성) 언제든 이전 코드로 되돌릴 수 있음
- (기록성) 이전 코드의 내용과 사유가 저장되어 오류 추적이 용이함
또한, 단순하게 버전 관리 기능을 제공하는 것 뿐만 아니라 여러 개발자들이 동시에 작업하다가 충돌이 발생할 경우 손쉽게 해결할 수 있는 기능을 제공합니다.
예를 들어서 원격 저장소에 있는 흰색 배경 원을 두 사람이 각각 가져왔다고 가정해보겠습니다.
윤슬이는 파란색 배경 원으로 변경하고, 나린이는 녹색 배경 원으로 변경했습니다. 그리고 윤슬이가 원격 저장소에 기록하고, 뒤 이어 나린이가 원격 저장소에 기록하면 문제가 발생합니다.
Git 주요 흐름
내 작업 공간에서 변경된 파일을 원격 저장소까지 올리는 일반적인 과정은 다음과 같습니다.
- 작업 파일 변경 : 사용자가 작업 디렉토리에서 파일을 수정합니다.
- 스테이징 영역에 추가 : 변경된 파일을 스테이징 영역에 저장합니다. (
git add
) - 커밋 : 변경 내용을 확정하고 로컬 저장소에 저장합니다. (
git commit
) - 원격 저장소에 동기화 : 변경 사항을 원격 저장소에 업로드합니다. (
git push
)
위 그림과 같이 Git은 변경된 파일을 바로 원격 저장소로 업로드 하지 않습니다. 이것이 다른 형상 관리 프로그램과 가장 큰 차이점 입니다.
작업 공간에서는 변경된 파일을 스테이징 영역(Staging Area)에서 관리합니다. 스테이징 영역에 있는 파일은 자유롭게 추가/삭제할 수 있으며, 사용자가 커밋 할 경우 스테이징 영역에 있는 파일이 로컬 저장소에 저장됩니다. 그리고 원격 저장소(Remote Repository)에 파일을 동기화 할 때는 로컬 저장소에 기록된 내용으로 원격 저장소와 동기화 합니다.
.git 폴더는 Git의 핵심 파일과 메타데이터를 포함하고 있습니다. 이 폴더가 삭제되면 Git 프로젝트가 일반 작업 디렉토리로 전환되니 주의하세요.
Git 호스팅 웹 서비스
Git 저장소를 제공하는 웹 서비스입니다. 다양한 제공 업체가 존재하고 있으나 대부분 GitHub 및 GitLab을 사용하고 있습니다.
GitHub
- 특징: 세계 최대 규모의 Git 저장소로, 개인 및 팀 개발자가 널리 사용합니다.
- 장점: 무료 저장소 제공, 다양한 협업 도구와 통합 가능.
GitLab
- 특징: 클라우드 기반뿐만 아니라 자체 서버에 설치해 사용할 수 있어 기업 환경에 적합합니다.
- 장점: DevOps 기능 내장, CI/CD(지속적 통합/배포) 도구와 통합 지원.
마치며
Git은 단순한 버전 관리 도구를 넘어 소프트웨어 개발의 핵심 도구로 자리 잡았습니다.
Git 개념 및 Git 원리를 이해하고 다양한 기능을 활용하면 프로젝트 관리와 협업이 훨씬 수월해집니다. 앞으로 Git에서 제공하는 다양한 기능을 활용할 수 있으면 좋겠습니다.