jc.jang

19일 - 단지 git branch가 하고 싶었을 뿐 본문

예전글/2018-3월

19일 - 단지 git branch가 하고 싶었을 뿐

jangstory 2018. 3. 19. 23:50

단지 git branch를 하고 싶었다.


버전관리 시스템이라고 git을 많이 사용한다고 하는데 여태껏 팀 프로젝트를 하면서 git을 사용해 본 적이 없었다. 그래서 git을 사용할 이유가 없었다. 그러다보니 요즘 opensource들은 다 git으로 공개하던데, git을 모르니 아무래도 내가 모르는 무언가가 있지 않을까 궁금하기도 했다. 그래서 git을 배워보기로 했다.


가장 쉬운 방법은 생활코딩 이고잉님 강의를 듣는 것인데, 사실 몇 주전에 듣고 또 까먹었다. 그래서 오늘은 저번에 들은 것 복습했다.


버전 관리, 그 어려운 것을 할 필요가 있다면 하는게 맞다. 관리하기 힘든 대상을 잘 관리 할 수 있게 도와주니까. 하지만 배보다 배꼽이 큰 상황이되면 곤란하다. 버전 관리가 딱히 필요없다면 dropbox나 googledrive같은 공유폴더를 만드는 것도 좋다. 하지만 git을 배우는 이유는 git 명령어만 치는게 아니라 git의 원리를 통해 새로운 영감을 얻을 수도 있고, 그냥 인간이기때문에 궁금해서 배운다.


놀라웠던 점은 commit할때, parent, tree, commit로 버전 관리를 한다는 것이었다. 사실 도대체 어떻게 버전 관리를 할까 생각 했었는데 강의를 보니까 신기했다. 파일 관리는 index와 object폴더에서 관리를 하고 index에서는 파일이름과 그 내용에 해당하는 해쉬코드 값을 이용해 어떤 파일의 내용을 가리키는 오브젝트를 만든다.



예를 들어 index 폴더에는

78e3459r02q34eq   // f1.txt

이런 식으로 저장이 되있을 것이다.

f1.txt는 파일이고 78~eq는 그 파일의 내용을 해쉬코드로 변환해서 얻은 값이다.

여기서 알 수 있는 것은 파일의 내용이 같으면 해쉬코드 값도 같고, 파일이름이 다르더라도 파일 내용이 같으니까 가리키고 있는 오브젝트 이름도 같다. 그러니까, 만약 f1.txt를 복사한 f3.txt가 있다면 그것또한


78e3459r02q34eq   // f1.txt

78e3459r02q34eq   // f3.txt

이렇게 저장된다.


그리고 object폴더에는 밑에 78이라는 폴더가 있고 그 밑에 e3459r02q34eq라는 파일이 존재한다.



commit의 원리

commit에는 주요한 정보 2가지가 들어간다.

한 가지는 parent라고해서 이번 commit 이전의 버전의 정보를 갖고 있는 commit을 가리키는 자료가 있고

다른 한 가지는 커밋이 일어난 시점에 작업 디렉토리에 담겨 있는 파일들의 정보(스냅샷)을 담고 있는 트리 라는 자료가 있다.

그래서 각 버전마다 다른 트리를 가리키고 있고 파일의 이름과 파일의 내용이 각각 링크가 되어있기 때문에 버전에 적혀있는 트리를 통해서, 버전이 만들어진 시점에 프로젝트 폴더에 대한 상태를 얻을 수 있다.

blob tree commit으로 구성 되어 있다.



단지 팀프로젝트때 git으로 버전관리하면서 코드 공유하고 싶었는데 git의 원리까지 알게 되는 신비함...

hash가 은근히 많이 쓰인다는 것을 알게 되었고 특히 commit할 때 이전 commit의 정보를 parent에 저장하고, tree로 현재 파일들의 정보를 저장하는 자료구조는 정말 끝내주는 것 같다.


내일 자취방 알아본다고 했는데 그냥 집에 와야겠다.... ㅠㅠㅠㅠ 내일은 git branch를 배워서 꼭 회사 pc랑 노트북이랑 같은 파일로 작업하고 싶다. pycharm이랑 visual studio연동하는 것도 분명 있는 것 같은데.... 알아봐야 겠다...

Comments