Git 교과서

코드 이력, 하나도 놓치지 마라!

버전 관리 시스템의 이해와 설치부터 커밋, 브랜치, 임시 처리, 병합, 복귀, 서브모듈, 태그까지
깃, 소스트리, 깃허브로 실습하며 기본기를 탄탄하게 다진다!

Yes24 교보문고 알라딘 인터파크 길벗

새로운 작업


브랜치(branch)는 나뭇가지, 지사, 분점 등 줄기 하나에서 뻗어 나온 갈림길을 의미합니다. 큰 나무 줄기에서 작은 줄기가 뻗어 나오는 것처럼 저장 공간 하나에서 가상의 또 다른 저장 공간을 만드는 것이라고 생각하면 됩니다.


브랜치 작업


우리는 오랫동안 알게 모르게 브랜치 작업을 해 왔습니다.

보통 새로운 기능을 추가하거나 많은 변경이 예상될 때 작업 폴더를 통째로 복사하고, 복사한 폴더 이름을 변경했습니다. 안정적인 기존 코드는 남겨 두고, 복제된 작업 폴더에서 도전적인 작업들을 하기 위해 코드를 분리합니다.

커밋은 파일의 수정 이력을 관리하는 데 사용한다면, 브랜치는 프로젝트를 독립적으로 관리하는 데 사용합니다. 개발자는 항상 안정된 코드 상태를 유지하고, 개발 중인 작업과 구분하여 관리해야 합니다.

잦은 버그 수정과 새로운 기능을 구현할 때마다 작업 폴더를 복사하는 것은 프로젝트를 유지 관리하는 측면에서 좋지 않습니다. 많은 프로젝트 폴더를 복제하면 향후 코드를 통합하기 어렵습니다.

그림 6-1] 브랜치 분기
브랜치 분기

깃을 사용하면 프로젝트 작업 폴더를 복사하지 않고 기존 코드와 분리해서 작업할 수 있습니다.


깃 브랜치 특징


깃 브랜치는 기존 폴더를 복제하는 것과 다르게 가상 폴더를 사용하여 개발 작업을 구분합니다. 브랜치는 다음 특징들이 있습니다.

  • 가상 폴더
    깃의 브랜치는 작업 폴더를 실제로 복사하지 않고, 가상 폴더로 생성합니다. 외부적으로는 물리적인 파일 하나만 있는 것으로 보입니다.

생성된 작업 폴더는 물리적으로 복제된 구조보다 유연하게 처리할 수 있습니다. 브랜치로 생성된 가상 폴더는 빠르게 공간 이동이 가능합니다. 개발자는 쉽게 가상 폴더인 브랜치를 이동하면서 프로젝트를 수행할 수 있습니다.

  • 독립적인 동작
    브랜치를 이용하면 원본 폴더와 분리하여 독립적으로 개발 작업을 수행할 수 있습니다. 기존에는 소스 코드의 작업 폴더를 별도로 생성했습니다. 물리적으로 복사된 각자의 폴더에서 코드를 작업한 후 소스 코드 2개를 다시 하나로 합쳐야 했습니다. 코드를 하나로 합치려면 작업 내역들을 일일이 찾아 정리해야 합니다. 소스 코드를 하나로 통합하는 것은 매우 힘든 작업입니다.

하지만 깃과 같은 버전 관리 시스템을 이용하면 분리된 코드를 좀 더 쉽게 병합할 수 있습니다. 분리된 브랜치에서 소스 코드를 각자 수정한 후 원본 코드에 병합하는 명령만 실행하면 됩니다. 깃의 브랜치는 규모가 큰 코드 수정이나 병합을 처리할 때 매우 유용합니다.

  • 빠른 동작
    다양한 버전 관리 도구도 브랜치 기능을 지원합니다. 보통 다른 VCS들은 브랜치를 생성할 때 내부 파일 전체를 복사합니다. 이때 파일 크기가 매우 크다면 브랜치를 생성하는 데 시간이 오래 걸립니다.

하지만 깃의 브랜치 기능은 다른 버전 관리 도구보다 가볍고, 브랜치 전환이 빠른 것이 특징입니다. 깃은 Blob 개념을 도입하여 내부를 구조화합니다. Blob은 포인트와 유사한 객체입니다. 깃은 브랜치를 변경할 때 포인터를 이동하여 빠르게 전환합니다.

브랜치 명령을 사용하면 내부적으로 커밋을 하나 생성하여 브랜치로 할당합니다. 다른 버전 관리 시스템은 폴더의 파일 전체를 복사하는 반면, 깃은 41바이트를 가지는 해시(SHA1) 파일 하나만 만들면 됩니다. 따라서 브랜치를 더 빠르게 생성할 수 있습니다.