이번에는 Git
의 내부가 Branch
를 사용하는 과정에 어떤 변화를 갖게되는지 알아보겠습니다.
먼저 gistory .git
을 실행해줍니다. gistory
가 처음이라면 gistory 글 을 먼저 보고 와주세요.
git init
을 해서 새로운 저장소를 만들때 HEAD
라는 파일이 생성됩니다.
git
에서 commit
을 하면서 HEAD
라는 파일에 어떤 변화가 생길까요?
한번 알아보겠습니다.
원래 쓰던 저장소 위치에서 f2.txt
를 만들고 git add f2.txt
와 git commit -m "1"
을 실행해주었습니다.
이전에 .git/HEAD
에서 하나의 경로가 있었는데 바로 refs/heads/master
입니다.
금방 commit
을 하고 새로고침을 하면 .git/refs/heads/master
라는게 새로 생기고 그곳에서 아까 commit
한 내용이 담겨 있습니다.
즉 처음 commit
을 하는 순간부터 refs/heads/master
파일이 만들어 집니다.
한번더 해봅시다. f2.txt
의 파일을 다시한번 수정해줍니다.
이후 -am
옵션을 사용해서 add
와 commit
를 동시에 해줍니다.
이번에 다시 gistory
를 새로고침하면 금방 commit
한 내용을 처음으로 가르키게 됩니다.
이때까지 내용을 정리하면 git
을 처음만들면 HEAD
라는 파일이 반드시 생기며 , 이 파일을 master
를 가르키게 됩니다.
그리고 이 master
이라는 파일은 가장 최신 commit
을 가르킵니다.
이를 통해 알 수 있는 사실 몇가지가 있습니다.
git log
를 했을때 git
이 번을 최신 commit
이라고 알 수 있던 이유는 이러한 형식으로 동작하기 때문입니다.
즉 git
은 HEAD
라는 파일을 가지고 있고 HEAD
는 또다시 refs/heads/master
를 가리키고 있고 이 파일은 가장 최근에 commit
을 한 object id
값을 가지고 있기 때문에
따라서 결론적으로 git
은 git log
를 하면 HEAD
파일을 보고 refs/heads/master
를 보고 master
파일에 적혀있는 commit object id
를 확인 함으로써
가장 최신의 commit
이 무엇인지를 알아낼 수 있습니다,
그리고 git
은 그 이전의 commit
은 parent
를 통해 찾아 낼 수 있습니다.
또한 알 수 있는 사실은 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
파일을 만들고 add
와 commit
를 해보겠습니다.
그러면 gistory
에서는 방금 commit
한 을 가르키게 됩니다.
이제 master
로 이동 해보겠습니다.
그렇다면 이제 gistory
에서 HEAD
파일의 가장 최신 commit
은 무엇일까요?
바로 exp
에서 가장 최신에 commit
한 이 아니라 master
에서 가장 최신에 commit
을 한 를 가르키게 됩니다.
이는 branch
의 원리와 완전 똑같습니다.
이 master
로 checkout
을 했을때 어떠한 파일과 디렉토리를 가지고 있어야 하는지는 tree
에서 확인가능합니다.
이는 git bash
에서도 ls -al
을 통해 f2.txt
를 확인 할 수 있습니다.
이렇게 해서 지금까지 branch
를 통해 내부적인 변화를 확인했습니다.
git log --branches --decorate --graph
를 할시 나타나는 HEAD
가 화살표로 가리키는 것은 현재 사용하고있는 branch
를 가르키는 것이며 이 HEAD
는 단순히 파일이며 역할은 현재 checkout
된 최신 commit
이 무엇인지를 알려주는 겁니다.