Mathlife
Mathlife의 학습 노트
Mathlife
전체 방문자
오늘
어제
  • 분류 전체보기
    • CS
      • 알고리즘
      • 자료구조
      • 운영체제
      • 네트워크
      • 데이터베이스
    • 프로그래밍 언어
      • Java
      • JavaScript
      • C·C++
      • Python
    • Backend
      • Spring
    • Frontend
      • HTML
      • CSS
    • Math
      • Linear Algebra
      • Calculus
    • AI
      • ML
      • DL
      • RL
    • Git

블로그 메뉴

  • 홈
  • 관리
  • 글쓰기
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Mathlife

Mathlife의 학습 노트

[Git 기초] 1. Git - 버전 관리 시스템
Git

[Git 기초] 1. Git - 버전 관리 시스템

2023. 12. 11. 16:51

Git은 전세계적으로 가장 많이 사용되는 분산형 버전 관리 시스템(Distributed Version Control System)이다. '분산형 버전 관리 시스템'이 무엇인지 이해하기 위해서는 먼저 '버전 관리 시스템'이 무엇인지를 알아야 한다. 이야기를 통해 '버전 관리 시스템'이 무엇인지 알아보자.


인디 게임 개발자 철수는 철수 RPG라는 게임을 만들기로 했다. 철수는 CsRpg라는 폴더를 만들고 이 폴더 안에서 게임을 위해 필요한 소스 코드와 리소스를 작성했다. 오랜 노력 끝에 철수는 게임을 완성하고 출시했다. 철수의 게임은 엄청난 흥행을 거두었다. 철수에겐 황금빛 미래만이 기다리고 있는 듯 했다.

 

언젠가부터 철수 RPG에 유저들의 혹평이 쏟아지기 시작했다. 컨텐츠가 너무 부족하다는 것이 그 이유였다. 철수는 유저들의 불만을 잠재우기 위해 새로운 컨텐츠 개발에 돌입했다. 철수는 CsRpg 폴더에 있는 소스 코드와 리소스를 수정해서 새로운 지역 5개와 새로운 몬스터 100마리를 추가했다. 프로젝트를 다시 빌드하고 실행 파일을 만들어 배포했다. 대규모 업데이트가 적용되자 유저들의 불만은 귀신같이 사그라들었다.

 

그런데 어느날부터 새로운 버전의 철수 RPG에서 심각한 돈복사 버그가 발견되었다. 게임 내 경제를 파탄에 이르게 할 수 있는 심각한 버그였기 때문에 철수는 버그를 오래 방치할 수 없었다. 하지만, 이 문제는 하루 이틀만에 해결할 수 있을 정도로 단순하지 않아서 빠른 시일 내에 버그를 직접 수정하는 것은 불가능에 가까웠다. 철수는 빠르게 정상 서비스를 제공하기 위해서는 버그가 없었던 이전 버전으로 롤백해야 한다는 판단을 내리게 되었다. 하지만, 이전 버전의 코드가 남아있지 않기 때문에 철수는 기억을 더듬어가며 일일히 롤백을 해야만 했다. 다행히도 철수는 기억력이 굉장히 좋아서 성공적으로 롤백을 해낼 수 있었다. 

 

롤백을 성공적으로 해냈지만 철수는 대규모 업데이트를 위해 이전에 만들었던 신규 지역과 신규 몬스터를 다시 개발해야만 했다. 똑똑한 철수는 같은 실수를 반복하지 않기 위해 프로젝트를 수정하기 전에 원본 프로젝트 CsRpg를 백업해두었다. 이후로도 철수는 업데이트를 할 때마다 최신 버전의 프로젝트를 직접 수정하는 대신 복사본을 만들어 복사본을 수정하는 방식으로 작업을 진행했다. 이와 같은 방법을 ㅌ오해 철수는 여러 버전의 프로젝트를 갖고 있으면서 필요할 때마다 이전 버전으로 롤백을 할 수 있게 되었다.

하지만, 게임을 계속 업데이트하면서 새로운 프로젝트가 우후죽순으로 생기게 되었고 너무 많은 저장 공간을 차지하게 되었다.


위 이야기에서 철수는 '버전 관리'의 필요성을 느끼고 수동으로 '버전 관리'를 하게 된다. 하지만, 수동으로 버전 관리를 하다보면 각 버전이 너무 많은 용량을 차지하게 되며, 각 버전 사이에 어떤 차이가 있는지도 쉽게 파악할 수 없게 된다. 알아서 효율적인 버전 관리를 해줄 수 있는 시스템이 필요하게 된다.

 

출처: https://stackoverflow.com/questions/8198105/how-does-git-store-files

Git을 사용하면 커밋이라는 스냅샷 단위로 버전을 관리할 수 있게 된다. Git은 다음과 같은 방법을 통해 모든 버전의 데이터를 효율적으로 저장한다.

 

먼저 Git은 해싱을 통해 각 파일을 효율적으로 저장한다. 위 그림에서 프로젝트는 C0, C1, C2의 3가지 버전을 갖고 있다. C0 버전은 비어있는 `index.js` 파일과 비어있는 `.gitignore` 파일로 구성되어 있다. C1 버전은 비어있는 `index.js` 파일과 '/lib\n/bin'이 추가된 `.gitignore` 파일로 구성되어 있다. C2 버전은 foo라는 내용이 추가된 `index.js` 파일과 C1 버전에서 수정되지 않은 `.gitignore` 파일로 구성되어 있다.

 

(비어있음)
foo
/lib
/bin

 

 

전체 버전은 3가지이지만 `index.js` 파일과 `.gitignore` 파일은 합쳐서 6개가 아닌 3개의 버전을 가지고 있다. Git은 내부 저장소에 위 3가지 버전을 해싱해서 저장한다. 

 

위와 같이 Git은 변경된 파일만을 저장하고 해싱을 통해 파일을 극도로 압축해서 저장하기 때문에 적은 용량으로도 모든 버전을 보관할 수 있다. 뿐만 아니라, Git은 여러 버전을 자유자재로 이동할 수 있는 기능과 브랜치를 따고 병합하는 기능 등 다양한 기능을 제공하는 등 수준 높은 버전 관리를 제공한다. 버전 관리가 필요하다면 Git을 사용하는 것이 꽤 좋은 선택지가 될 것이다.

 

    Mathlife
    Mathlife

    티스토리툴바