#21 Git - Branch 원리

김현준·2022년 12월 25일
0

GIT

목록 보기
21/41
post-custom-banner

이번에는 Git 의 내부가 Branch 를 사용하는 과정에 어떤 변화를 갖게되는지 알아보겠습니다.

먼저 gistory .git 을 실행해줍니다. gistory 가 처음이라면 gistory 글 을 먼저 보고 와주세요.

git init 을 해서 새로운 저장소를 만들때 HEAD 라는 파일이 생성됩니다.
git 에서 commit 을 하면서 HEAD 라는 파일에 어떤 변화가 생길까요?
한번 알아보겠습니다.

원래 쓰던 저장소 위치에서 f2.txt 를 만들고 git add f2.txtgit commit -m "1" 을 실행해주었습니다.

이전에 .git/HEAD 에서 하나의 경로가 있었는데 바로 refs/heads/master 입니다.

금방 commit 을 하고 새로고침을 하면 .git/refs/heads/master 라는게 새로 생기고 그곳에서 아까 commit 한 내용이 담겨 있습니다.

즉 처음 commit 을 하는 순간부터 refs/heads/master 파일이 만들어 집니다.

한번더 해봅시다. f2.txt 의 파일을 다시한번 수정해줍니다.

이후 -am 옵션을 사용해서 addcommit 를 동시에 해줍니다.

이번에 다시 gistory 를 새로고침하면 금방 commit 한 내용을 처음으로 가르키게 됩니다.

이때까지 내용을 정리하면 git 을 처음만들면 HEAD 라는 파일이 반드시 생기며 , 이 파일을 master 를 가르키게 됩니다.
그리고 이 master 이라는 파일은 가장 최신 commit 을 가르킵니다.

이를 통해 알 수 있는 사실 몇가지가 있습니다.

git log 를 했을때 git22 번을 최신 commit 이라고 알 수 있던 이유는 이러한 형식으로 동작하기 때문입니다.

gitHEAD 라는 파일을 가지고 있고 HEAD 는 또다시 refs/heads/master 를 가리키고 있고 이 파일은 가장 최근에 commit 을 한 object id 값을 가지고 있기 때문에

따라서 결론적으로 gitgit log 를 하면 HEAD 파일을 보고 refs/heads/master 를 보고 master 파일에 적혀있는 commit object id 를 확인 함으로써
가장 최신의 commit 이 무엇인지를 알아낼 수 있습니다,

그리고 git 은 그 이전의 commitparent 를 통해 찾아 낼 수 있습니다.

또한 알 수 있는 사실은 git 에서 branch 를 하는것은 단지 refs/heads/master 의 파일을 가르키는것을 의미합니다.

이번에는 branch 를 하나 만들어 보겠습니다.

gistroy 를 새로고침하고 git\refs\heads\exp 을 보면 이전에 master 에 있는 내용과 똑같습니다.

아까 말했듯이 branch 는 단지 .git/refs/heads/exp 파일을 가르킵니다. 만약 이 파일을 삭제하면 어떻게 될까요?

바로 branch 를 삭제하는것과 동일한 의미를 지닙니다.

branch.git/refs/heads/exp 를 가르킨다는 것을 증명할 수 있습니다.

이번에는 가장 최신의 commit 아이디를 복사하겠습니다.
230d8b20399e0e44e1a0ee411329cd3bca8c28e1

반대로 .git/refs/heads/exp 파일의 내용을 만들면 branch 를 사용하지 않고서도 git branch exp 기능을 수행 할 수 있습니다.

git 에서는 branch 가 굉장히 중요하고 강력한 기능을 가지지만 그것은 그저 파일 하나일 뿐입니다. 바이너리 파일이 아니라 일반 텍스트 파일입니다.

git checkout exp 를 하면 gistory 에서 무슨 변화가 생길까요?

새로고침하면 HEAD 파일이 변경되고 이 파일은 이제 더이상 refs/heads/master 를 가르키는게 아니라 refs/heads/exp 를 가르키게 됩니다.

이번에는 exp 에서 f3.txt 파일을 만들고 addcommit 를 해보겠습니다.

그러면 gistory 에서는 방금 commit33 을 가르키게 됩니다.

이제 master 로 이동 해보겠습니다.

그렇다면 이제 gistory 에서 HEAD 파일의 가장 최신 commit 은 무엇일까요?
바로 exp 에서 가장 최신에 commit33 이 아니라 master 에서 가장 최신에 commit 을 한 22 를 가르키게 됩니다.
이는 branch 의 원리와 완전 똑같습니다.

mastercheckout 을 했을때 어떠한 파일과 디렉토리를 가지고 있어야 하는지는 tree 에서 확인가능합니다.

이는 git bash 에서도 ls -al 을 통해 f2.txt 를 확인 할 수 있습니다.

이렇게 해서 지금까지 branch 를 통해 내부적인 변화를 확인했습니다.

git log --branches --decorate --graph 를 할시 나타나는 HEAD 가 화살표로 가리키는 것은 현재 사용하고있는 branch 를 가르키는 것이며 이 HEAD 는 단순히 파일이며 역할은 현재 checkout 된 최신 commit 이 무엇인지를 알려주는 겁니다.

profile
울산대학교 IT융합학부 22학번
post-custom-banner

0개의 댓글