처음 github을 접하고 branch를 생성하고 작업을 하고 있을 때는 당연히 현재 작업하고 있는 공간을 복사해서 하나의 새로운 작업 공간으로 만드는 것이라고 생각했었습니다. 하지만 실제 github의 branch는 이렇게 동작하고 있지 않았습니다. 여기서 github branch가 어떻게 생성 되는지 그리고 어떻게 동작 하는지 알아보도록 하겠습니다.
Commit을 조금 더 이해하기
이전의 github 이해하기-1에서 commit은 소스 코드의 변경사항을 포함한 전체를 하나의 snapshot으로 만든다는 것을 알았습니다. 우선 테스트 할 디렉토리를 하나 만들고 readme.md파일 하나를 추가해 봅시다.
mkdir gittest
cd gittest
git init
touch readme.md
git add .
git commit -m "added readme.md"
위 처럼 readme.md 파일을 add 하고 commit을 완료 했습니다. 그리고 git log 로 현재의 commit 상태를 확인 해 보겠습니다.
github 은 최초 commit 시에 master 라는 branch를 기본으로 생성 해주며 commit을 수행 할 때 마다 HEAD -> 브랜치명 과 같은 텍스트가 commit id 우측에 표시 됩니다.
commit은 시간 순으로 쌓이며, 현재 branch가 어떤 commit을 가리키고 있냐 하는 것입니다. 여기서 두명의 개발자가 commit 5cc02923d742bb007cccadf86876d79f8b8f5213 을 기준으로 같은 파일인 readme.md 를 수정하여 commit 하게 되면 충돌이 일어나게 됩니다. 사실 먼저 수정하고 commit하는 개발자가 승자(?)가 되는 것이죠.
Branch 만들고 다시 commit 이해하기
자 이제 이 상태에서 branch를 만들고, readme.md 파일을 수정하고 commit 해보겠습니다.
git checkout -b branch1
vi readme.md
git log
새로운 commit 인 6ae27ed931a49bb91cffc65667b9a2d0745272a0은 HEAD -> branch1이라고 표시되어 있습니다. 그리고 master에서 생성한 commit 들도 보입니다. 브랜치 branch1을 master를 기준으로 최초 생성 했을때는 5cc02923d742bb007cccadf86876d79f8b8f5213 commit을 기준으로 HEAD -> branch1,master라고 표시 되어 있었을 것입니다. 여기서 다시 master branch의 로그를 확인해 보겠습니다.
master branch는 5cc02923d742bb007cccadf86876d79f8b8f5213에 멈춰 있고 HEAD -> master 라고 표시 되어 있습니다.
현재의 각 branch별 commit의 상태는 위의 그림과 같습니다. commit은 위 그림 처럼 이전 commit을 가르키거나 각 브랜치 들이 어떤 commit을 가르키고 있냐 하는 것입니다. 그런데 git은 이 branch들을 굉장히 빠르게 이동 할 수 있습니다. 그것을 가능 해 주는 것이 HEAD라는 특수한 pointer입니다. 앞서 commit을 할때 마다 각 commit은 HEAD -> 브랜치명으로 현재 브랜치가 가리키는 commit을 나타내 줬습니다. 이 HEAD가 git의 branch 사이를 빠르게 이동하고 또한 특정 commit을 직접적으로 가리키게 할 수 있는 것입니다.
1 thought on “github 이해하기-2”