티스토리 뷰

Git 정리

Git 원리소개(1)

lsh424 2020. 2. 8. 01:55

Git 정리(3)으로 넘어가기 전에, Git의 간단한 원리를 정리해보고 넘어가고자 합니다.

생활코딩의 깃 강의를 들어보면 이고잉님이 서두에 이런 말씀을 하십니다.

1. 원리를 알고 공부 하면 기억이 오래가고 응용이 가능하다.
2. 원리를 공부하면서 다양한 영감을 받을 수 있다.

저에게 있어서 너무 공감가는 얘기였습니다. 어떤 분야이던지 기술만 배워서 사용하고 적용할 수 있지만, 어느 수준 이상에 도달 하기 위해서는 해당 기술에대한 원리 이해가 필수적이라고 생각하고 있었거든요. 

옛말에 "기초가 중요하다.", "기초가 튼튼해야한다.", "초석을 잘 다져야된다." 등의 말이 동일한 맥락에서 나온 말이라고 생각합니다. 그래서 Git이 어떤식으로 동작하는 건지 간단한 원리를 짚고 넘어가려 합니다!

 

프로젝트 디렉토리에서 ls -al 이라고 입력하면 .git이라는 파일이 보일겁니다. 여기서, cd .git 을 통해 .git 디렉토리로 이동해서 다시 ls -al 이라고 입력을 해보면 HEAD, branches...,index,.... logs, objects,refs 등의 파일이 있는것을 볼 수 있습니다.

 

앞서 배웠던 것을 되짚어 보면, 저희는 버전을 관리하기 위해 처음에 git init을 함으로써 git 환경을 

만들어 줍니다. 그 다음, git add 라는 작업을 해주는데, git add를 할 때 그 add 되는 파일의 이름과 내용은 

어떻게 관리 될까요? 

 

이때 git은 매우 효율적으로 작동합니다. git add라는 작업을 수행할때 파일의 이름은 index에서 관리하고 

파일의 내용은 objects에서 관리합니다.  그렇기때문에, 만약 파일의 이름이 달라도  그 안의 파일 내용이 같다면 같은 objects 파일을 가리킵니다. 같은내용, 다른이름의 파일이 여러개 있어도, 그 이름 갯수에 맞춰 그만큼의 파일이 별도 저장되는 것이 아니라는거죠. (때에 따라서 많은 중복의 제거가 가능합니다.)

 

objects파일을 가리킨다고 위에 설명 했는데, 무언가를 가리키고 분별하려면 고유한 이름 혹은 식별자가 필요하겠죠? git은 파일의 내용에 따라 SHA1 해시 알고리즘을 사용해 고유한 이름을 도출 합니다.

 

git은 이렇게 파일이나 커밋등 모든 오브젝트를 SHA-1으로 해시한 식별자를 통해 관리합니다. 

 

해시함수란?

더보기

임의의 길이를 갖는 임의의 데이터에 대해 고정된 길이의 데이터로 맵핑하는 함수로, 이 함수를 통해 도출된 값을 해시 값 이라고 합니다. 보통은 같은 입력 값에 대해 같은 출력 값이 보장됩니다.

임의의 길이를 갖는 임의의 데이터에 대해 고정된 길이의 데이터로 맵핑하는 함수로, 이 함수를 통해 도출된 값을 해시 값 이라고 합니다. 보통은 같은 입력 값에 대해 같은 출력 값이 보장됩니다.

 

커밋 역시 객체로써, 커밋 내용이 objects 디렉토리 하위에 저장되는데요.

그 안을 들여다 보면, parent, tree, blob이란 걸 볼 수 있습니다.

 

parent는 해당 커밋의 이전 커밋을 가리키고, 해당 커밋이 첫번째 커밋이라면 parent는 존재하지 않습니다.

tree는 커밋이 만들어진 시점의 파일 이름과 파일 내용을 갖고있는 파일 링크(blob)를 갖고 있습니다.

blob은 파일 내용을 담고 있구요!

 

이렇게 git은 서로의 식별자를 갖고 있으면서 링크되는 상태로 관리가 되게 됩니다.

 

git status 같은경우, 가장 최근 커밋 tree와 index의 내용이 일치하는지 유무에 따라 현재 커밋할 파일이 있는지 없는지 판단 합니다.

 

git의 명령어에 따라 어떻게 동작하는지에 대한 간단한 개략도 입니다.

 

 

제가 쓴 글이 잘 이해가 안된다 하시는 분들은!! 생활코딩 Git 원리 강의를 참고하시면 좋을 것 같습니다. :)

'Git 정리' 카테고리의 다른 글

Git 정리(5) - stash  (0) 2020.02.18
Git 정리(4) - Merge  (0) 2020.02.18
Git 정리(3) - branch  (0) 2020.02.17
Git 정리(2) - git add & commit  (0) 2020.02.07
Git 정리(1) - git init에 대해 알아보자!  (0) 2020.02.03
댓글
링크
최근에 올라온 글
최근에 달린 댓글