[Git] 커밋개체와 브랜치 - Commit Object & Branch

권준혁·2020년 11월 1일
0

Git

목록 보기
4/8
post-thumbnail
post-custom-banner

안녕하세요
깃의 가장 강력한 기능인 Git Branch에 대한 포스팅입니다.
브랜치를 이용하면 하나의 프로젝트를 독립적으로 개발할 수 있습니다.

Pro Git 2판을 읽으며 포스팅했습니다.
Pro Git 2판 e-book 다운

브랜치 모델이 Git의 최고의 장점이고, Git이 다른 것들과 구분되는 특징이라고 합니다.
브랜치를 새로 만들고 브랜치 사이를 이동할 수도 있습니다.
그리고, 브랜치를 만들어 작업하고 나중에 Merge하는 방법을 권장합니다.

다른 VCS들은 데이터를 변경사항으로 기록합니다. 깃은 변경사항으로 기록하지 않고 스냅샷으로 기록합니다.

1.커밋 개체 (commit object)

커밋하면 깃은 현 Staging Area에 있는 데이터의 스냅샷에 대한 포인터, 저자나 커밋 메세지같은 메타데이터, 이전 커밋에 대한 포인터 등을 포함하는 커밋 Object를 저장하게됩니다.

4대 원소라는게 있습니다. 위 사진과 함께 보면 좋습니다.

  • commit : 회색박스 부분이고 메타데이터와 tree에 대한 포인터, 이전 커밋 포인터를 가집니다.
    tree에 대한 포인터는 회색박스 내에 tree에 92ec2라고 적힌 부분입니다 .
  • tree : 트리오브젝트의 용량인 size, 파일명, 각 blob들에 대한 위치정보 같은 것들을 담고 있습니다.
  • *blob(binary large object) : * 파일에 대한 정보를 담고있는 개체입니다.
  • tag : 앞서 공부했던 tag입니다.

그러니까, 간단하게 생각하면 커밋 개체는 전체의 정보를 담은 commit, 파일들의 구조를 담은 tree, 각 파일들의 데이터를 담은 blob으로 나뉜다는 것입니다.
간단하게만 알아봤는데 이해하기가 조금 수월해진 것 같습니다.

커밋에는 이전 커밋에 대한 포인터가 있기 때문에 무엇을 기준으로 바뀌었는지를 알 수 있습니다.
최초 커밋을 제외한 나머지 커밋은 이전 커밋 포인터가 적어도 하나씩 있게 됩니다.
브랜치를 합친 Merge커밋은 이전 커밋 포인터가 여러 개 있습니다.


2.브랜치 (Branch)

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 커밋을 가리키고 있습니다.

2-1. 브랜치 이동하기

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에 대해서 알아보겠습니다.

profile
웹 프론트엔드, RN앱 개발자입니다.
post-custom-banner

0개의 댓글