[Git] git이란

Dev·2021년 9월 17일
0

1. Git이란?

Distributed Version Control System
소스 코드를 효과적으로 관리하기 위한 '분산형 버전 관리 시스템'입니다.

Q) Version Control System 이란?
파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전(스냅샷)을 다시 꺼내올 수 있는 시스템입니다.

  • 프로젝트 진행 중 버그 코드의 '추적'이 가능합니다.
  • 파일을 잃어버리거나 잘못 고쳤을 때 원하는 버전으로 쉽게 '복구'할 수 있습니다.
  • branch, PR 등 '협업'을 수월할게 할 수 있습니다.

Q) Distributed Version Control System 이란?
로컬, 리모트 서버는 마지막 스냅샷만을 저장하지 않고 델타와 스냅샷 등 모든 '히스토리' 내역을 보유합니다. 만약 리모트 서버에 문제가 생기면 로컬 저장소에 있는 복제물로 다시 작업할 수 있습니다. 왜냐하면 로컬 서버와 리모트 서버 모두 '동일한' 파일을 가지고 있기 때문입니다.

델타 : 저장소 이전 버전과 다음 버전 변경 내역에 관한 데이터
스냅샷 : 특정 버전의 소스코드

2. Git 저장 방식

git은 각 시점의 스냅샷과 델타를 함께 저장합니다. git은 델타로 저장할지 아니면 스냅샷으로 저장할지 '스스로' 판단하여 속도 & 메모리 비효율을 최소화합니다.

왼쪽 그림은 rev 버전별 스냅샷만을 저장한 방식입니다. 반면 오른쪽 그림은 마지막 버전 파일 하나만 스냅샷 방식으로 저장하고 그 이전 버전들은 모두 델타로 저장한 방식입니다. 만약 rev4 버전 코드를 요구한다면 왼쪽 그림은 해당 버전의 스냅샷을 바로 보여줄 수 있습니다. 하지만 오른쪽 그림에서는 rev6의 스냅샷에서 rev5, rev4의 델타를 적용해서 보여줍니다.

만약 스냅샷의 크기가 약 1kb이고 파일의 변경이 거의 없다면 스냅샷을 모두 저장하는 왼쪽 방식은 메모리 낭비가 발생합니다. 따라서 git은 두가지 방식을 혼용하여 '스스로' 판단하에 저장합니다.

3. Git Command Local

프로젝트의 모든 히스토리가 로컬에도 동일하게 있기 때문에 네트워크 속도에 영향 받지 않습니다. (물론, github같이 remote server에 올리는 경우에는 받습니다.) 예를 들어, 프로젝트의 히스토리를 조회할 때 리모트 서버에 접근할 필요 없이 로컬에서 해당 파일을 바로 찾을 수 있습니다. 와이파이가 없거나, VPN에 연결되 있지 않아도 막힘없이 일을 할 수 있습니다.

4. Git의 무결성

git은 파일을 저장하기 전 SHA-1 Hash를 사용하여 체크섬을 구하고, 파일을 관리합니다. 체크섬은 40자리의 16진수 문자열로 구성되며, commit id로 불립니다. commit id가 같은 것은 파일 내용 및 디렉토리 구성이 완벽히 같다는 것으로, commit id로 각각의 커밋을 구별합니다. 모든 파일이 체크섬이라는 검사를 거쳐 잘못된 파일을 수정, 삭제할 일이 없습니다.

5. Git의 영역 및 상태

[1] Git 영역

  • Git Directory : git 프로젝트의 모든 '메타 데이터'와 'object db'가 이곳에 저장됩니다. git의 핵심 정보가 들어있으며 '.git' 디렉토리에 담깁니다.
  • Staging Area : Index 영역이라고도 불리며 git 디렉토리에 index 파일로 존재합니다. working 디렉토리에서 작 업 후 특정 파일들을 add하면, 해당 파일들은 staging area로 이동합니다. 이를 stage 동작이라 부릅니다. 즉, staging area는 commit 하기 전에 거쳐가는 공간입니다.
  • Working Directory : 현 브랜치의 개발 파일들이 존재합니다. 만약 checkout하여 브랜치가 바뀌면 해당 브랜치의 개발 파일들로 변환됩니다.

git 작업 flow

  1. 개발자가 working directory에서 파일을 수정합니다.
  2. staging area에 파일을 stage하여 커밋할 파일을 지정합니다.
  3. staging area에 파일들을 commit하여 저장소에 영구적으로 저장할 스냅샷 및 델타를 저장합니다.

[2] Git 상태

  • git directory에 존재하는 파일들은 committed 상태입니다.
  • working directory에서 파일을 수정한 후, staging area에 추가했다면 staged 상태입니다.
  • working directory에서 파일을 수정한 후, staging area에 추가하지 않았다면 modified 상태입니다.

Reference
https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EA%B8%B0%EC%B4%88

https://junwoo45.github.io/2019-09-03-git%EC%9D%B4%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94%EB%B0%A9%EC%8B%9D/

https://dololak.tistory.com/303

profile
성장하는 개발자가 되고싶어요

0개의 댓글