-
[git] IntroduceGit 2021. 8. 11. 15:20
1. git이란?
소스코드를 효과적으로 관리하기 위한 '분산형 버전 관리 시스템[DVCS]'입니다.
Q) 버전 관리 시스템이란?
A) 파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템입니다.
- 프로젝트 버그시 누가 문제를 일으켰는지 '추적'할 수 있습니다.
- 파일을 잃어버리거나 잘못 고쳤을 때 원하는 버전으로 쉽게 '복구'할 수 있습니다.
- 팀 프로젝트시 branch, merge 등 '협업'을 수월하게 할 수 있습니다.
Q) Distributed Version Control System이란?
A) 단순히 서버 파일의 마지막 버전 스냅샷만을(특정 버전의 소스코드) 저장하지 않고, 로컬 저장소에 델타, 스냅샷 등의 모든 히스토리를 복제합니다. 만약 서버에 문제가 생기면 로컬 저장소에 있는 복제물로 다시 작업할 수 있습니다. 왜냐하면 로컬과 리모트 서버 모두 동일한 파일을 가지기 때문입니다.
2. git 특징
1) git 저장 방식
git은 각 시점의 스냅샷과, 델타를 병행하여 저장합니다. 여기서 델타란 저장소의 이전 버전과 다음 버전의 변경 내역에 관한 데이터입니다.
왼쪽 그림은 rev 버전 별 스냅샷만을 저장한 방식입니다. 오른쪽 그림은 마지막 버전 파일 하나만 스냅샷 방식으로 저장하고, 그 이전 버전들은 모두 델타를 저장한 방식입니다. 오른쪽 그림에서 rev4를 요구한다면 rev6의 스냅샷에서 rev5와 rev4의 델타를 적용해서 보여줍니다. 반면 왼쪽 그림은 해당 버전의 스냅샷을 바로 보여줄 수 있습니다.
만약 왼쪽 방식이고, 스냅샷의 크기가 약 1kb라면 스냅샷들을 계속 통째로 저장하기에 메모리적 낭비가 발생할 수 있습니다. 오른쪽 방식은 400줄 코드에서 1000줄 코드가 추가되고, 변경 내용이 많다면 델터로만 저장하기에는 성능 이슈가 발생할 수 있습니다. 따라서 git은 두가지 방식은 혼합합니다. git은 스스로 비교하여 델타로 저장할지 아니면 스냅샷으로 저장할지 '스스로' 판단하여 메모리상 효율적으로 저장합니다.
git은 커밋한다면 반드시 git db에 데이터가 추가되어, 되돌리거나 데이터를 삭제할 방법이 없어집니다. 물론 커밋하지 않은 내역의 경우 변경 사항을 잃어버릴 수 있습니다. 하지만 일단 스냅샷을 커밋하고나면 데이터를 잃어버리기는 어렵습니다.
git 저장 방식 소개 [왼쪽은 스냅샷만을 오른쪽은 델타와 스냅샷을 혼합한 방식] 2) 대부분의 명령을 로컬에서 실행합니다.
프로젝트의 모든 히스토리가 로컬에 동일하게 있기 때문에 모든 명령이 순식간에 실행됩니다. 이는 네트워크의 속도에 영향을 덜 받기 때문입니다. 예를 들어, 프로젝트의 히스토리를 조회할 때 리모트 서버에 접근할 필요 없이 로컬에서 해당 파일을 바로 찾을 수 있습니다. 와이파이가 없거나, VPN에 연결되 있지 않아도 막힘 없이 일을 할 수 있습니다.
3) git의 무결성
git은 파일을 저장하기 전에 SHA-1 해시를 사용하여 체크섬을 구하고, 그 체크섬으로 파일을 관리합니다. 이렇게 모든 파일이 체크섬이라는 검사를 거쳐 잘못된 commit id에 접근하는 일이 없기 때문에 일관성 있는 데이터를 제공합니다.
체크섬은 40자리의 16진수 문자열로 구성되며, commit id로 불리기도합니다. commit id가 같은 것은 파일 내용과 디렉토리 구성이 완벽히 같다는 것으로, commit id로 각각의 커밋을 구별 합니다. 이렇게 git은 모든 것을 '해시'로 식별합니다.
4) git 영역 및 상태
git 영역
git은 'git directory', 'working directory', 'staging area' 세 가지 영역이 존재합니다.
- git directory : git 프로젝트의 모든 '메타 데이터'와 'object db'가 이곳에 저장됩니다. git의 핵심 정보가 들어가며 '$ git init'으로 초기에 '.git' 디렉토리가 생성됩니다.
- working directory : 현재 브랜치의 개발 파일들이 존재합니다. 우리는 이곳에서 프로젝트 개발 및 수정을 진행합니다. 만약 checkout하여 브랜치가 바뀌면 해당 브랜치의 개발 파일로 변환됩니다.
- staging area : index 영역이라고도 불리며 git 디렉토리에 index 파일로 존재합니다. working 디렉토리에서 작업한 후 특정 파일들을 add하면, 해당 파일들은 staging area로 이동합니다.[stage 동작] 즉 commit 하기 전에 거쳐가는 공간입니다.
※ 일반적으로 git으로 하는 작업은 다음과 같습니다.
- 개발자가 working directory에서 파일을 수정합니다.
- staging area에 파일을 stage하여 커밋할 '스냅샷 및 델타'를 만듭니다.
- staging area에 있는 파일들을 commit하여 git 저장소에 영구적으로 스냅샷을 저장합니다. 특정 명령어를 통해 staging area를 거치지 않고 바로 commit할 수도 있습니다.
git 상태
git으로 관리하는 파일들은 committed, staged, modified의 3가지 상태로 존재합니다.
- git directory에 존재하는 파일들은 committed 상태입니다.
- working directory에서 파일을 수정 한 후, staging area에 추가했다면 staged 상태입니다.
- working directory에서 파일을 수정 한 후, staging area에 추가하지 않았다면 modified 상태입니다.
Git 영역 및 상태 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
Git - Git 기초
Subversion과 Subversion 비슷한 놈들과 Git의 가장 큰 차이점은 데이터를 다루는 방법에 있다. 큰 틀에서 봤을 때 VCS 시스템 대부분은 관리하는 정보가 파일들의 목록이다. CVS, Subversion, Perforce, Bazaar 등
git-scm.com
git이 저장하는 방식
저는 git을 잘다루고 싶습니다.
junwoo45.github.io
https://dololak.tistory.com/303
[Git] Git 세 가지 영역 및 상태 Committed, Modified, Staged 설명
Git 에서 세 가지 영역 Git 프로젝트는 Git 디렉터리, 워킹 트리, Staging Area 라는 세 가지 영역을 갖게 됩니다. Git 프로젝트에서 파일들은 아래 세 가지 영역별로 다양한 상태를 가지게 됩니다. Git
dololak.tistory.com
'Git' 카테고리의 다른 글
[git] 실제 프로젝트에 적용하는데 필요한 tip (0) 2021.08.20 [git] workflow (0) 2021.08.20 [git] Github (0) 2021.08.13 [git] Command (0) 2021.08.12