Git commit, branch, checkout에 대해서

September 04, 2019

Git 특징

  • git의 저장소는 파일의 변경사항으로 기록하는 것이 아님
  • 그 상태의 기록을 snapshot 형태로 저장함

Snapshot 저장 Flow

  • 파일3개와 커밋메세지로 커밋
git add . git commit -m "initial commit"
  • 파일 checksum과 함께 저장소에 저장 - 이를 blob이라고 함 (해당 파일들의 checksum을 함께 저장)
  • 루트디렉토리, 하위디렉토리의 트리객체를 checksum과 함께 저장
  • 커밋개체를 생성하면서 이를 가리키는 메타데이터 및 트리개체를 가리키는 포인터 정보를 커밋 개체에 넣음
  • 이를 통해 한번 커밋시 파일갯수 + 2개의 데이터 개체가 생성
  • 모든 데이터개체는 snapshot을 동시에 저장

Git branch

  • commit 사이를 가볍게 이동할 수 있도록 하는 포인터와 같은 역할을 함
  • 기본 구조 (A 커밋 → B 커밋 → C 커밋)
  • A커밋이 최초 생성되며, 이후 진행되는 commit의 경우 이전 commit의 parent를 바라봄
  • 바라보는 순으로 화살표 표시

Branch 생성하기 (HEAD) 포인터

  • git에는 HEAD 라는 포인터가 존재함

    • HEAD는 현재 작업하고 있는 로컬 브랜치의 위치를 나타냄
  1. 다른 브랜치를 생성하는 경우 (feature/1)
  2. HEAD 포인터는 feature/1 브랜치를 가리키게됨
git checkout master git checkout -b feature/1
  • feature/1 브랜치에서 D 커밋 생성
git checkout feautre/1 git add . git commit -m "D commit"
  • HEAD 는 D브랜치를 작업한 feature/1 브랜치 포인터로 이동
  • feature/1 → master 브랜치 이동
  • 현재 master 브랜치가 최근 상태인 C2 커밋에 HEAD 포인터가 위치함
  1. master 브랜치에서 D` 커밋
  2. D 커밋 외 master 브랜치에는 D` 커밋이 존재하여 해당 커밋이 master의 HEAD 포인터에 위치함
...