안녕하세요
깃의 가장 강력한 기능인 Git Branch에 대한 포스팅입니다.
브랜치를 이용하면 하나의 프로젝트를 독립적으로 개발할 수 있습니다.
Pro Git 2판을 읽으며 포스팅했습니다.
Pro Git 2판 e-book 다운
브랜치 모델이 Git의 최고의 장점이고, Git이 다른 것들과 구분되는 특징이라고 합니다.
브랜치를 새로 만들고 브랜치 사이를 이동할 수도 있습니다.
그리고, 브랜치를 만들어 작업하고 나중에 Merge하는 방법을 권장합니다.
다른 VCS들은 데이터를 변경사항으로 기록합니다. 깃은 변경사항으로 기록하지 않고 스냅샷으로 기록합니다.
커밋하면 깃은 현 Staging Area에 있는 데이터의 스냅샷에 대한 포인터, 저자나 커밋 메세지같은 메타데이터, 이전 커밋에 대한 포인터 등을 포함하는 커밋 Object를 저장하게됩니다.
4대 원소라는게 있습니다. 위 사진과 함께 보면 좋습니다.
92ec2
라고 적힌 부분입니다 .그러니까, 간단하게 생각하면 커밋 개체는 전체의 정보를 담은 commit, 파일들의 구조를 담은 tree, 각 파일들의 데이터를 담은 blob으로 나뉜다는 것입니다.
간단하게만 알아봤는데 이해하기가 조금 수월해진 것 같습니다.
커밋에는 이전 커밋에 대한 포인터가 있기 때문에 무엇을 기준으로 바뀌었는지를 알 수 있습니다.
최초 커밋을 제외한 나머지 커밋은 이전 커밋 포인터가 적어도 하나씩 있게 됩니다.
브랜치를 합친 Merge커밋은 이전 커밋 포인터가 여러 개 있습니다.
commit히스토리가 책이라면 브랜치는 책갈피 같은 느낌입니다.
그럼 실습을 위해
브랜치를 먼저 하나 만들어보겠습니다.
$ git branch testing
새로 만든 브랜치도 지금 작업하고있는 마지막 커밋을 가리키게 됩니다.
Git에서는 현재 작업 중인 브랜치를 나타내는 HEAD
라는 포인터가 있습니다. 이 포인터는 지금 작업하는 로컬 브랜치를 가리킵니다. git branch
명령은 브랜치를 만들기만하고 브랜치를 옮기지 않습니다.
git log --decorate
옵션으로 브랜치가 어떤 커밋을 가리키는지 확인할 수 있습니다.
$ git log --oneline --decorate
f30ab (HEAD -> master, testing) add feature #32 - ability to add new
formats to the central interface
34ac2 Fixed bug #1328 - stack overflow under certain conditions
98ca9 The initial commit of my project
master와 testing 브랜치가 f30ab
커밋을 가리키고 있습니다.
testing 브랜치로 이동해보겠습니다.
$ git checkout testing
이제 HEAD
는 testing브랜치를 가리킵니다.
텍스트 파일 하나를 생성하고 commit해보겠습니다.
$ git add sometext.txt
$ git commit -m "made sometext file"
이렇게 되면 현재 브랜치의 상황은 아래 그림처럼 됩니다.
HEAD
가 가리키는 브랜치인 활성화된 testing은 가장 최근의 commit으로 이동했지만 master브랜치는 아직 이전의 커밋을 가리키고있습니다.
이 상태에서 master브랜치로 돌아가보겠습니다.
$ git checkout master
현재 브랜치 상황입니다.
가장 중요한 점 은 워킹 디렉터리를 확인해 보면 알 수 있습니다.
HEAD가 가리키는 커밋의 시점으로 워킹 디렉터리도 되돌려진 것을 알 수 있습니다.
아까 만들었던 sometext.txt 파일은 사라지고 없습니다.
확실히.. 가장 강력한 기능이라고 했던 것이 납득이 됩니다.
여기서 한 걸음 더 나가서 새로운 커밋을 생성해보겠습니다.
sometext2.txt
를 만듭니다.
당연히 브랜치는 갈라지게 됩니다.
로그를 확인해보겠습니다.
$ git log --oneline --decorate --graph --all
브랜치는 어떤 한 커밋을 가리키는 40글자의 SHA-1 체크섬 파일에 불과합니다. 따라서 새로 브랜치를 만드는 것은 41바이트 크기의 파일을 하나 만드는 것에 불과합니다.
부담없이 만들고 사용해도 된다는 것입니다.
이 번 포스팅은 여기까지입니다.
Branch에서 정리를 해봤는데, 엄청나게 강력한 기능인 것은 확실합니다.
오늘은 Branch를 생성하고 commit이 갈라지는 상황까지 실습해봤습니다.
다음 포스팅에서는 갈라진 Branch를 합치는 방법 Merge에 대해서 알아보겠습니다.