Git에 대해 배울 때 알아두면 좋은 것이 바로 Git이 어떻게 동작하는지에 대한 이론이다.
Git에는 버전 관리 시 "스냅샷"이라는 방식을 사용하는데, 이를 SVN에서 사용하는 "델타"라는 방식과 비교하면 Git 동작 방식에 대한 이해가 쉬워지고 왜 Git이 더 널리 활용되는지 알 수 있다.
간단히 정리하자면 아래와 같다.
- 델타 : 차이점만 저장하는 방식
- 스냅샷 : 변경된 파일 전체를 저장하는 방식
예를 들어 파일 A에 "Hello World"라는 문장을 추가한다면, 델타 방식은 "Hello World"만 저장하지만 스냅샷 방식은 Hello World 문구가 추가된 파일 A 자체를 다시 저장한다.
얼핏 보면 델타가 스냅샷보다 이득이라고 생각할 수 있다.
스냅샷은 1줄만 변경되어도 전체 내용을 저장해야 하지만, 델타는 바뀐 1줄만 저장하면 되기 때문이다.
하지만 조금 더 깊이 생각하면 오히려 델타 방식이 더욱 비효율적이라는 것을 알 수 있다.
델타 방식을 사용한다면 1개 파일 내용을 로드할 때 맨 처음 파일이 생성되었을 때부터 모든 변경사항 내용을 계산하여 결과를 만들어 내야 할 것이다.
만약 100번 파일이 수정되었다면 나중에 파일을 불러오고 싶을 때 1 ~ 100번 수정된 내역을 모두 계산하여 파일을 복원해야 한다는 것이다.
하지만 스냅샷을 저장하는 Git은 그러한 계산이 필요 없다.
스냅샷 방식에서는 모든 스냅샷(커밋)이 LinkedList 형식으로 되어 있다.
즉, 스냅샷 방식에서는 바로 앞에서 바뀐 커밋과 비교하는 연산 한 번만 수행해도 파일 간 차이점을 비교할 수 있다.
또한 변경되지 않은 파일은 이전 파일의 링크만 저장하면 되기 때문에 용량도 작게 들고 계산도 필요 없어진다.
Untracked : Staging Area에 한 번도 등록되지 않은 파일
Tracked : Staging Area에 등록된 이후 파일은 아래 3가지 상태를 가질 수 있다.
프로젝트를 수행하기 위해선 일단 프로젝트에 포함되는 작업물들을 만들어야 할 것이다.
이 작업물들은 작업 공간(Working Directory)에는 존재해 있는 상태지만 Git 입장에서는 Stage에 올라온 적 없는 미지의 작업물들이다.
즉, 한 번도 스테이징 되지 않은 "Untracked 상태"의 파일인 것이다.
A와 B는 현재 Working Directory에만 존재하는 "Untracked File"이다.
파일 A와 B를 git add
명령어를 통해 스테이징 하자.
이전에 말했듯 Staging 이란 Staging Area에 작업물을 등록하는 것을 의미한다.
이제 스테이지에 파일 A와 B가 등록되었으니 A와 B는 "Staged 상태"의 파일이 되었다.
git commit
명령으로 커밋을 수행하여 현재 Staging Area에 올라와 있는 파일들을 하나의 스냅샷(버전/커밋)으로 만들었다.
이제 파일 A와 파일 B는 Staging Area에 등록도 되어 있고 현재 로컬 저장소의 커밋과 비교도 가능하기 때문에 "Unmodified 상태"의 파일이라 부를 수 있다.
프로젝트를 진행하다 보니 파일 A를 살짝 변경해야 할 필요성이 생겼다.
그래서 파일 A를 A'으로 변경하였다.
이후 동일하게 git add
명령을 통해 파일 A'을 스테이지에 등록시켰다.
파일 A'은 파일 A였을 때부터 스테이지에 등록되어 있던 파일이므로 Tracked 파일이다.
동시에 비교할 수 있는 스냅샷(최초 커밋)이 존재하는 상태이다.
즉, 최초 커밋과 비교했을 때 차이가 존재하고 스테이지에 등록된 파일이므로 "Modified 상태"의 파일이다.
추가로, 파일 B는 최초 커밋 상태와 동일하므로 "Unmodified 상태"를 유지될 것이다.
이 과정에서는 파일 B는 Unmodified 상태이므로 굳이 커밋 할 필요가 없다.
Modified 상태였던 파일 A'만 다시 커밋함으로써 새로운 스냅샷을 만들 수 있을 것이고, 다시 파일 A'은 Unmodified 상태가 될 것이다.
이 과정을 봤다면 어떻게 커밋을 변경시킴으로써 과거 버전 파일을 불러올 수 있는지 알 수 있을 것이다.
만약 내가 파일 A를 불러오고 싶다면 최초 스냅샷에서 파일 A만 불러옴으로써 과거 버전의 파일로 복원시킬 수 있는 것이다.