개발을 하다보면 코드를 여러개로 복사해야 하는 일이 자주 생깁니다. 코드를 통째로 복사하고 나서 원래 코드와는 상관없이 독립적으로 개발을 진행할 수 있는데, 이렇게 독립적으로 개발하는 것이 브랜치입니다.
Git의 브랜치는 커밋 사이를 가볍게 이동할 수 있는 어떤 포인터 같은 것입니다.
브랜치가 없다면 기존 폴더를 복사해서 거기서 작업을 해야하지만 Git은 브랜치라는 기능을 제공해서 폴더를 복사하지 않고 바로 브랜치를 만들어서 거기서 작업을 할 수 있게 해줍니다.
Git으로 커밋을 진행하다 보면 아래와 같이 커밋이 쌓입니다.
새로 만든 커밋은 기존 커밋 다음에 시간순으로 쌓입니다. 위의 화살표에서 알 수 있듯이 커밋은 바로 이전 커밋을 가리키고 있습니다.(최초의 커밋을 제외한 나머지 커밋은 이전 커밋을 가리키는 포인터가 있습니다.)
한명이 작업한다면 위의 그림처럼 한줄로 커밋을 쌓아가면 됩니다. 그런데 두명 이상이 협업을 한다면 어떨까요?
자연스럽게 두 줄로 갈래가 나뉘게 됩니다.
이렇게 특정 기준에서 줄기를 나누어 작업할 수 있는 기능을 브랜치라고 합니다.
새로운 가지로 커밋을 만들려면 반드시 브랜치를 먼저 만들어야 합니다.
브랜치 생성하기
testing이라는 브랜치를 생성해보겠습니다. 아래와 같이 git branch (생성할 브랜치 이름)을 통해 브랜치를 만들 수 있습니다.
브랜치를 새로 만들면 지금 작업하고 있던 마지막 커밋을 가리킵니다.
Git은 HEAD라는 특수한 포인터가 있는데 이 포인터는 지금 작업하는 로컬 브랜치를 가리킵니다.
브랜치를 새로 만들었지만, Git은 아직 master 브랜치를 가리키고 있습니다.
git branch 명령은 브랜치를 만들기만 하고 브랜치를 옮기지 않습니다.
git log 명령에 —decorate 옵션을 사용하면 브랜치가 어떤 커밋을 가리키고 있는지 확인할 수 있습니다.
브랜치 이동하기
git checkout 명령으로 다른 브랜치로 이동할 수 있습니다. 한번 testing 브랜치로 이동해보겠습니다.
이렇게 하면 HEAD는 testing 브랜치를 가리킵니다.
이제 파일 하나를 더 만들어서 새로운 커밋을 해보겠습니다.
testing 브랜치에서 커밋을 하나 했기 때문에 testing 브랜치는 앞으로 이동했습니다. 하지만 master 브랜치는 여전히 이전 커밋을 가리킵니다.
이제 master 브랜치로 되돌아가겠습니다.
돌아가면 master 브랜치가 가리키는 커밋을 HEAD가 가리키게 하고 워킹 디렉토리의 파일도 그 시점으로 되돌려 놓습니다. 커밋을 하면 다른 브랜치의 작업들과 별개로 진행되기 때문에 testing 브랜치에서 임시로 작업을 하고 원래 master 브랜치로 돌아와서 하던 일을 계속할 수 있습니다.
❗️브랜치를 이동하면 워킹 디렉토리의 파일이 변경됩니다.
이전에 작업했떤 브랜치로 이동하면 워킹 디렉토리의 파일은 그 브랜치에서 가장 마지막으로 했던 작업 내용으로 변경됩니다. 파일 변경시 문제가 있어 브랜치를 이동시키는게 불가능한 경우 Git은 브랜치 이동 명령을 수행하지 않습니다.
이제 master 브랜치에서 파일을 만들고 다시 커밋을 해보겠습니다.
master 브랜치에서 파일을 만들고 커밋을 진행하면 프로젝트 히스토리는 분리돼서 진행됩니다. 우리는 브랜치를 하나 만들어서 그 브랜치에서 일을 좀 하고, 다시 원래 브랜치로 되돌아와서 다른 일을 했습니다. 두 작업 내용은 서로 독립적으로 각 브랜치에 존재합니다. 커밋 사이를 자유롭게 이동하다가 때가 되면 두 브랜치를 Merge 합니다.
이제 git log 명령어에 아래와 같이 옵션을 적절하게 줘서 브랜치 히스토리가 무엇이고 어떻게 갈라져 나왔는지를 볼 수 있습니다.
❗️ vscode의 Git Graph Extension을 설치해서 그래프를 볼 수도 있습니다.
브랜치의 정체를 밝혀보자
브랜치는 어떠한 커밋을 가리키는 40글자 SHA-1 체크섬 파일에 불과하기 때문에 만들기도 쉽고 지우기도 쉽습니다. 새로 브랜치를 만드는 것은 41 바이트 크기의 파일을 하나 만드는 것에 불과합니다.