Git 교과서

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

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

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

코드의 변화


깃은 개발 중인 코드의 이력을 만들 수 있습니다. 깃이 코드 변화를 기록하는 것을 커밋(commit)이라고 합니다. 먼저 커밋의 뜻부터 알아봅시다. 영어로 commit은 여러 의미가 있습니다. 그중 깃의 동작과 가장 유사한 의미는 ‘~를 적어 두다’입니다. 즉, 커밋은 의미 있는 변경 작업들을 저장소에 기록하는 동작입니다.

개발 과정에서 소스 코드는 수없이 수정됩니다. 일반적으로는 새로운 기능을 추가하는 코드를 삽입합니다. 또 버그를 수정하려고 많은 코드를 이동하거나 대체합니다. 이러한 코드 수정은 개발 목적을 달성하는 작업들입니다.

예를 들어 다음과 같이 텍스트 코드를 수정한다고 합시다.

  • 변경 전
    안녕하세요.
    반갑습니다.
    
  • → 변경후
    안녕하세요 지니입니다.
    이렇게 만나서 반갑습니다.
    

작업자는 개발 과정에서는 수정 내용을 기억하지만, 변경된 내용이 많거나 시간이 흐르면 이를 모두 기억하기 어렵습니다. 개발하는 도중 실수나 여러 가지 이유로 변경 전 시점으로 되돌아가야 한다면 어떻게 해야 할까요?

수정된 모든 코드 작업을 하나씩 되돌리면서 과거 시점까지 수정해야 할 것입니다. 하나라도 빠지거나 기억하지 못한다면 어떻게 할까요? 난감할 것입니다. 그래서 개발자는 만일의 경우에 대비하여 중간에 코드 변경 과정을 기록하길 원합니다. 변경 시점을 저장해 두면 잘못된 동작을 발견했을 때 특정 시점으로 되돌아갈 수 있습니다.

  • 최종본
    안녕하세요 지니입니다.
    이렇게 만나서 반갑습니다.
    
  • → 이전으로 복귀
    안녕하세요.
    반갑습니다.
    

이때 필요한 것이 깃의 버전 관리입니다. 깃은 코드의 변경 이력과 시점을 커밋으로 기록합니다. 사용자가 일일이 기억하지 않아도 됩니다. 또 이전 시점으로 쉽게 되돌아갈 수 있으며, 실수도 없습니다.


파일 관리 방법


먼저 깃이 없던 시절, 전통적인 파일의 이력 관리 방법을 알아봅시다. 보통 우리는 의미 있는 변경을 할 때 파일을 복사합니다. 그리고 복사한 새 파일에는 추가하거나 변경하고 싶은 내용을 적용합니다. 하지만 이렇게 파일을 복사하는 형태는 파일의 변경 내역을 기록하는 것보다 더 많은 파일을 생성하고 관리해야 하는 부작용이 있습니다. 또 모든 내용이 중복되기 때문에 용량도 많이 차지합니다.


파일 복사로 파일 관리


반면 깃의 커밋은 새로 변경된 부분만 추출하여 저장합니다. 그것도 파일 이름을 변경하지 않고도 동일한 파일 이름으로 하나로 관리가 가능합니다. 즉, 시간에 따라 변화되는 내용만 관리하고, 코드가 변화된 시간 순서에 따라서 영구적으로 저장합니다. 이를 커밋이라고 합니다.


그림 4-2] 깃으로 파일 관리
깃으로 파일 관리


개발자 입장에서는 복잡한 구조의 파일을 관리하지 않아도 되고, 여러 개의 파일보다는 파일 하나로 모든 이력을 처리하기 때문에 유용합니다. 커밋은 부모 커밋(parent commit)을 기반으로 변화된 부분만 새로운 커밋으로 생성합니다. 그리고 커밋은 파일의 시간적 변화도 함께 저장합니다.