리눅스 사용자라면 새로운 프로그램을 다운로드하거나 CVS, Subversion 같은 버전 관리 시스템을 찾아볼 때 한 번쯤 Git(깃)이라는 이름을 접했을 것입니다. Git은 리눅스 커널의 아버지로 유명한 리누스 토르발스(Linus Torvalds)가 기존 솔루션의 부족함을 해결하고자 직접 만든 버전 관리 시스템입니다. 설계의 핵심은 무엇보다 속도, 즉 효율성에 두었으며, 이전 시스템들의 단점을 보완하면서도 훨씬 적은 시간 안에 모든 작업을 처리합니다. Git을 배우고 싶다면 이 초보자 가이드가 훌륭한 출발점이 되어줄 것입니다.
Git이 하는 일
고객을 위해 웹사이트를 제작하는 상황을 생각해 봅시다. 고객이 요구사항을 전달하면 여러분이 디자인하고, 고객이 검토 후 수정 사항을 요청하는 과정이 반복됩니다. 수정 요청이 있을 때마다 사이트는 변화하고 성장합니다. 그러던 어느 날 고객이 "작년 9월 모습이 더 마음에 드는데요"라고 말한다면 어떻게 될까요? 일반적인 경우라면 큰일입니다. 당시의 파일과 데이터를 모두 갖고 있지 않을 수 있고, 코드가 너무 많이 바뀌어서 예전 상태로 되돌리는 것이 어렵거나 불가능할 수 있습니다.
버전 관리 시스템의 존재 이유는 바로 위에서 언급한 문제들을 거의 모두 해결하는 것입니다. 코드와 파일에 가해진 모든 변경 사항을 추적하고, 언제든 원하는 지점으로 돌아갈 수 있게 해 줍니다.
Git의 작동 방식
각 프로젝트의 디렉터리는 그 자체로 하나의 Git 저장소(repository)가 됩니다. 해당 디렉터리에 프로젝트 파일을 모두 보관하고, 주기적으로 현재 파일 상태를 Git에 기록하라고 알려주면 됩니다. 이렇게 상태를 기록하도록 지시하는 과정을 커밋(commit)이라고 합니다. 커밋을 할 때마다(자주 할수록 좋습니다) Git은 추적 대상으로 지정된 모든 파일을 살펴보고, 변경된 차이점만 ".git" 디렉터리에 저장합니다. 매 커밋은 프로젝트 개발 과정의 새로운 복원 지점이 되는 셈입니다.
원한다면 로컬 Git 저장소를 GitHub나 자체 Git 서버 같은 외부 호스트에 푸시(push)할 수도 있습니다. 이를 통해 여러 기여자가 각자의 로컬 저장소에 빠르게 자주 커밋하고, 그 내용을 하나의 업데이트로 묶어 온라인 저장소에 반영할 수 있습니다.
이것이 다른 버전 관리 시스템(VCS)보다 Git이 빠른 이유 중 하나입니다. 매번 서버에 업로드하느라 시간과 대역폭을 낭비하지 않고도 로컬 저장소에 자유롭게 커밋할 수 있기 때문입니다.
Git 설치하기
대부분의 리눅스 배포판에는 Git이 미리 설치되어 있습니다. 만약 시스템에 없더라도 소프트웨어 센터나 패키지 관리자를 통해 간단히 설치할 수 있습니다. 대부분의 저장소에서 쉽게 찾을 수 있기 때문입니다.
터미널에서 다음과 같이 설치할 수 있습니다:
# Debian/Ubuntu sudo apt install git-all # Fedora sudo dnf install git-all
다른 플랫폼을 사용하거나 패키지 저장소를 이용할 수 없는 환경이라면 공식 웹사이트(git-scm.com)에서 패키지를 다운로드해 수동으로 설치하면 됩니다.
Git 사용하기
로컬 Git 저장소를 만드는 과정은 빠르고 간단합니다. 먼저 프로젝트에 사용할 디렉터리를 생성한 뒤, 터미널에서 해당 위치로 이동합니다.
cd /my-git-directory
다음 명령으로 Git 저장소를 초기화합니다:
git init
이렇게 하면 저장소 정보를 담는 ".git" 디렉터리(숨겨져 있음)가 생성됩니다. 이제 파일을 추가해 볼 차례입니다. 간단한 README 파일을 만들고, 이 파일을 추적 목록에 등록한 후 저장소에 커밋해 보겠습니다.
# 새 파일에 텍스트 입력 echo "TODO: Create documentation" > README.txt # Git에게 이 파일의 변경 사항을 추적하라고 알림 # 이 작업은 파일당 한 번만 하면 됩니다 (자세한 내용은 아래에서) git add README.txt # Git 저장소에 현재 상태를 기록 git commit README.txt
그러면 텍스트 편집기 화면이 열립니다(어떤 편집기가 열리는지는 배포판과 설정에 따라 다릅니다). 여기에 이번 커밋에 대한 메모를 입력하세요. 보통 마지막 커밋 이후 발생한 변경 사항에 대한 간단한 요약을 적습니다. 편집기를 저장하고 종료하면 커밋이 성공적으로 완료됩니다.
위 과정에서 Git이 사용자를 인식하지 못한다는 오류를 출력한다면, 자신이 누구인지 알려줘야 합니다. 다음 두 명령만 입력하면 됩니다:
git config --global user.name "Your_Username" git config --global user.email "your_email_address@mailserver.com"
이제 파일의 현재 상태 스냅샷이 만들어졌습니다. 이후의 변경 사항(커밋하는 경우)은 이 스냅샷 위에 계속 누적되어 저장됩니다.
위 예시처럼 파일을 하나씩 추가하고 커밋하는 것은 번거로울 수 있습니다. 이럴 때는 다음 명령으로 현재 디렉터리의 모든 파일을 한꺼번에 추가할 수 있습니다.
# 끝의 "."에 주목하세요 git add .
또한 다음 명령으로 추적 중인 모든 변경 파일을 한 번에 커밋할 수 있습니다.
git commit -a
그 외에 유용하게 쓸 수 있는 Git 명령 옵션들입니다:
# 기존 저장소 전체를 복제 (예: 소프트웨어 프로젝트 웹사이트에서) git clone (URL, ie git://github.com/github/linux-2.6.git) # 파일 이동/이름 변경. bash에서 직접 옮긴 경우 # 삭제 후 재추가하는 번거로움을 덜어줍니다 git mv (source) (destination) # 파일을 삭제하고 Git 저장소에서도 제거 git rm (target) # 이 저장소의 브랜치 확인 git branch # 새 브랜치 생성 git branch (new branch name, ie "experimental") # 브랜치 간 전환 git checkout (branch name, ie "experimental") # 현재 브랜치로 다른 브랜치 병합 git merge (branch)
물론 이것은 Git이 할 수 있는 일의 시작에 불과합니다. Git을 충분히 익힌 후에는 GitHub를 시작해 보고, 풀 리퀘스트(pull request)에 스크린샷과 애니메이션을 첨부하는 방법도 학습해 보세요. 꾸준히 연습하다 보면 버전 관리가 개발 워크플로우의 강력한 무기가 될 것입니다.