깃(GIT)이란 무엇인가?-(1)
안녕하세요. 코딩벅스입니다.
소프트웨어 개발 프로젝트는 규모가 커지면 여러 사람들이 협업하는 경우가 대부분입니다. 그래서 하나의 서버를 두고 이곳에 개발중인 코드를 저장하고 서로 공유하는 경우가 많죠. 그런데 협업 과정에서 누군가 실수로 개발중인 코드를 지웠을 때, 이를 복원하느라 애를 먹는 상황이 발생하기도 합니다. 단순히 공용 서버에 어떤 폴더를 두고 그곳에서 서로 작업 내용을 공유하고 관리한다면, 이러한 불상사는 언제든지 발생할 수 있습니다.
이러한 사고를 막고, 소중한 자산인 개발 내용들을 잘 관리하기 위해서 별도의 관리 소프트웨어가 있고, 이를 보통 형상 관리 툴, 또는 버전 관리 시스템(Version Control System)이라고 합니다. Git은 이러한 문서나 코드 등의 개발 과정에서 버전을 관리하기 위한 목적으로 만들어진 툴 가운데 대표적인 하나입니다.
저는 입사 후 Git이 아닌, 다른 유료의 버전 관리 툴을 사용했었습니다. 비용은 물론 회사가 내주었죠^^. 나름 깔끔한 UI에 편리한 사용설명까지, 마음 편하게 썻습니다. 물론 네트워크가 먹통이 되기라도 하면 코드 반영이 어려운 단점도 있었지만요. (이건 아래에서 설명드리겠습니다.)
그러다 부서를 옮기게되고, 새로운 프로젝트를 진행하면서 Git을 접하게 되었고, 이 녀석의 장점을 알게 되었죠. 젤 중요한 건, Git은 공짜입니다. 인터페이스가 상대적으로 구려서 처음 사용하시는 분들은 다소 불편하고, 배우는데 시간이 걸리는 단점도 있지만, 한번 잘 알아두면 상용 형상관리 툴 못지않게 괜찮은 녀석이죠.
형상 관리 소프트웨어 가운데서 Git과 대표적으로 자주 비교되는 툴이 SVN(SubVersion)인데요. 둘 사이의 큰 차이점은 Git은 DVCS(Distributed Version Control Systems)이고 SVN은 VCS(Version Control Systems)라는 겁니다. 한마디로, Git은 코드 관리가 공용 서버에서 뿐만 아니라, 자신만의 컴퓨터에서도 이루어질 수 있다는 거죠. 이에 반해, SVN은 서버에서만 코드 관리가 이루어져, 오프라인상태에서는 코드 수정 내용의 반영이 어렵죠.
물론, Git도 타인과 코드 공유를 하려면, 언젠가 네트워크에 연결되어야 하겠죠.
Git 은 네 가지 영역으로 나뉩니다.
- 워킹 트리(Work Space 혹은 Working Directory)
- 스테이징 영역(Staging Area)
- 로컬 저장소(Local Repository)
- 원격 저장소(Remote Repository)
원격 저장소(Remote Repository)
서버에 위치한 영역입니다. 허가받은 타인도 이 영역에 접근해 코드를 공유할 수 있죠. 기업들은 보통 보안적인 이유로 자체 서버를 마련하고, 여기에 원격 저장소들을 마련하기도 합니다. 일반 사용자들은 Github과 같은 웹호스팅 서비스를 통해, 이러한 원격 저장소를 할당 받습니다.
로컬 저장소(Local Repository)
자신의 PC에 존재하는 관리 영역입니다. “.git”이라는 폴더 이름을 가지고, 이 폴더안에서 각 코드의 형상을 “snapshot(스냅샷)”개념으로 관리합니다. 오프라인에서도 코드 수정 반영 및 형상 관리가 가능한 것도, 이러한 로컬 저장소 때문이죠.
작업 디렉토리(Working Directory)
실제 코드, 즉 파일들이 위치하는 영역입니다. 특정한 버전으로 사용자가 “Checkout”을 하면, “.git”내 DB의 압축이 풀리면서 작업 디렉토리가 생성됩니다. 또한 Git은 작업 디렉토리에 포함된 파일들의 변경사항을 추적하는 시스템을 가집니다. 물론 이러한 추적을 피하도록 파일단위로 설정할 수도 있죠.
스테이징 영역(Staging Area)
매우 중요한 개념입니다. Git을 처음 접하는 분들이 어려워하는 개념이죠. 쉬운 이해를 위해, 한마디로 정의하면, “반영되기 직전의 파일들의 임시처소?”정도라고 할 수 있겠네요.
위처럼 “git add“라는 명령어를 실행하면 작업 디렉토리내 해당 파일의 변경 여부를 판단하고, 변경 발생시 Staging Area로 올려둡니다. 이렇게 Staging Area로 올려진 파일은, “git status”로 확인할 수 있습니다. 그리고 원할 때 “git commit”라는 명령어를 통해 로컬 저장소로 반영합니다. 이러한 별도의 영역, Staging Area가 왜 필요할까요? 그건 다음 부분에서 빛을 발하기 때문이죠.
- 부분 커밋하기
- 충돌 해결하기
- 다시 커밋하기
Git의 특징과 개념은 여기까지 할게요. 다음 연재에서는 실제로 Git을 사용해서 코드를 변경하고 업로드하는 과정을 살펴보도록 하겠습니다.