nyximos.log

[Git] Git Workflow, Git이 데이터를 저장하는 법 본문

Programming/Git&GitHub

[Git] Git Workflow, Git이 데이터를 저장하는 법

nyximos 2022. 2. 16. 23:21

Git

  • 데이터를 Change Set이나 변경사항(Diff)으로 기록하지 않고 일련 일련의 스냅샷으로 기록한다.
  • 커밋하면 현 Staging Area에 있는 데이터의 스냅샷에 대한 포인터, 저자나 커밋 메시지 같은 메타 데이터, 이전 커밋에 대한 포인터 등을 포함하는 커밋 개체(커밋 Object)를 저장한다.
  • 이전 커밋 포인터가 있어서 현재 커밋이 무엇을 기준으로 바뀌었는지를 알 수 있다.
  • 최초 커밋을 제외한 나머지 커밋은 이전 커밋 포인터가 적어도 하나씩 있고 브랜치를 합친 Merge 커밋 같은 경우에는 이전 커밋 포인터가 여러개 있다.

 

파일이 3개있는 디렉토리가 하나있고 파일을 Staging Area에 저장하고 커밋하는 예제

  • 파일을 Stage
  • Git repository에 파일을 저장(Blob)
  • Staging Area에 해당 파일의 checksum을 저장

 

checksum

  • Git에서 사용하는 가장 기본적인 데이터 단위이자 Git의 기본철학이다.
  • 해당 커밋의 고유 번호, 40자 길이의 16진수 문자열이다.
  • Git은 SHA-1 hash를 사용해서 checksum을 만든다.
  • Git은 데이터를 저장하기 전에 항상 checksum을 구하고 checksum으로 데이터를 관리한다.
  • checksum을 이해하는 Git없이는 어떠한 파일이나 디렉토리도 변경할 수 없다.
  • Git없이는 checksum을 다룰 수 없어서 파일의 상태도 알 수 없고 심지어 데이터를 잃어 버릴 수도 있다.
  • 파일의 내용이나 디렉토리 구조를 이용하여 checksum구한다.
  • git log 명령어를 통해 checksum을 확인할 수 있다.

 

 

Git Workflow

Git은 파일을 Committed, Modified, Staged 세가지 상태로 관리한다.

 

Committed

데이터가 로컬 데이터베이스에 안전하게 저장됐다.

Modified

수정한 파일을 아직 로컬 데이터베이스에 커밋하지 않은 것

Staged

현재 수정한 파일을 곧 커밋할 것이라고 표시한 상태

 

1. Work on Stuff : 파일 생성,수정, 삭제 등

2. Add Changes : 커밋을 위해 특정 변경사항을 그룹화한다.

3. Commit : 이전에 추가한 것들 모두 커밋한다.

Working Directory

  • Working tree 라고도 한다.
  • 작업중인 디렉토리
  • 프로젝트 특정 버전을 Checkout 한 것이다.
  • Git 디렉토리는 지금 작업하는 디스크에 있고, 그 디렉토리 안에 압축된 데이터베이스에서 파일을 가져와서 Working tree를 만든다.

Staging Area

  • Git에서는 기술용어로는 "Index"라고 하지만, "Staging Area"라는 용어를 써도 상관 없다.
  • 변경사항 추가
  • Git directory에 있다.
  • 단순한 파일이고 곧 커밋할 파일에 대한 정보를 저장한다.

Repository

  • .git directory
  • Git directory는 Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳
  • Git directory가 Git의 핵심이다.
  • Git directory는 다른 컴퓨터에 있는 저장소를 Clone 할 때 만들어진다.

 

Git이 하는 기본적인 일

1. Working tree에서 파일을 수정한다.

2. Staging Area파일을 Stage 해서 커밋할 스냅샷을 만든다. 모든 파일을 추가할 수도 있고 선택하여 추가할 수도 있다.

3. Staging Area에 있는 파일들을 커밋해서 Git directory에 영구적인 스냅샷으로 저장한다.

 

Git directory에 있는 파일들은 Committed 상태이다.

파일을 수정하고 Staging Area에 추가했다면 Staged다.

Checkout 하고 나서 수정했지만, 아직 Staging Area에 추가하지 않았으면 Modified이다.

 

 

파일이 3개 있는 디렉토리가 하나있고 파일을 Staging Area에 저장하고 커밋하는 예제를 살펴보자.

파일을 Stage하면 Git 저장소에 파일을 저장하고(Blob), Staging Area에 해당 파일의 checksum을 저장한다.

$ git add README test.rb LICENSE
$ git commit -m 'The initial commit of my project'

 

git commit으로 커밋하면 먼저 루트 디렉토리와 각 하위 디렉토리의 트리 개체를 checksum과 함께 저장소에 저장한다.

그 다음 커밋 개체를 만들고 메타 데이터와 루트 디렉토리 트리 개체를 가리키는 포인터 정보를 커밋 개체에 넣어 저장한다.

그래서 언제든지 스냅샷을 다시 만들 수 있다.

 

이작업을 마치면 Git repository에는 5개의 데이터 개체가 생긴다.

각 파일에 대한 Blob 3개, 파일과 디렉토리 구조가 들어있는 tree 개체 1개, 메타데이터와 root tree를 가리키는 포인터가 담긴 커밋 개체 1개이다. 

https://git-scm.com/

 

다시 파일을 수정하고 커밋하면 이전 커밋이 무엇인지도 저장한다.

https://git-scm.com/

 

 

참조

https://git-scm.com/

 

Git

 

git-scm.com