이번 포스팅에서는 git의 브랜치에 대한 명령어를 살펴보는 것이 아니라, 브랜치의 기본 개념에 대해서 알아봅니다. 즉, 이론 중심적인 포스팅입니다. 각각의 주제에 대한 명령어 포스팅들은 추후에 따로 올라갈 예정입니다.
Branch(브랜치) 개요
깃에서 브랜치는 버전을 여러 흐름으로 나누어 관리하는 방법입니다. 브랜치를 사용하는 이유는 바로 "협업"을 위함입니다. 여러 개발자들이 동시에 작업을 할 때, 서로 영향을 받지 않고 작업을 진행할 수 있게 합니다. 브랜치를 통해 버전을 나누어 관리하는 방법은 다음과 같습니다.
- 브랜치를 나눈다.
- 각자의 브랜치에서 작업한다.
- 필요한 경우, 나눈 브랜치를 합친다.
이 과정들을 통해 더 간편하게 협업하고, 효율적으로 작업을 진행할 수 있습니다. 어떤 프로젝트이든지 간에 가장 기본적으로 작업하는 브랜치를 Master(Main) 브랜치라고 합니다.
HEAD, 체크아웃(checkout)
HEAD는 현재 작업 중인 "브랜치의 최신 커밋"을 가리키는 용어입니다. 브랜치를 관리하며 자유자재로 HEAD의 위치를 바꿀 수 있습니다.
체크아웃(Checkout)은 특정 브랜치에서 작업할 수 있도록 작업 환경을 바꾸는 것을 의미합니다. 여러 브랜치를 나누어서 개별로 작업을 할 때, 체크아웃을 하면 작업하던 브랜치에서 다른 브랜치로 작업 환경을 변경할 수 있습니다.
특정 브랜치로 체크아웃을 하면 HEAD의 위치가 변경한 브랜치의 최신 커밋을 가리키게 됩니다.
병합(Merge)
브랜치를 통해 버전을 나누어 작업하고 관리하는 과정 중, "나눈 브랜치를 합쳐야 할 때"가 있습니다. 이때, 브랜치를 합치는 것을 "병합"이라고 합니다. 영어로는 Merge라고 합니다.
그런데, 병합하는 과정 중 문제가 생길 수 있습니다. 병합하려는 두 브랜치가 서로 같은 내용을 다르게 수정했을 때 문제가 발생합니다. 이를 "충돌"이라고 합니다. 영어로는 Merge Conflict라고 합니다. 충돌을 브랜치 협업 과정 중 빈번하게 발생하는 문제이기에 이에 대해 잘 숙지해야 합니다.
충돌을 해결하기 위해서는 "두 브랜치가 같은 내용을 다르게 수정했을 때", 어떤 브랜치의 내용을 가져갈지 선택해야 합니다. 선택을 개발자가 직접 해야 합니다. 그렇게 자신이 원하는 내용으로 수정한 브랜치를 선택하여 병합을 진행하면 충돌이 해결됩니다.
재배치(Rebase)
마지막으로, 재배치(rebase)는 브랜치가 뻗어나온 기준점을 변경하는 것을 말합니다. 예를 들어 Master 브랜치에 커밋이 총 4개 쌓여있다고 했을 때, 2번 커밋에서 "branch1" 브랜치를 만들었다고 가정합시다. 이때 "branch1" 브랜치는 2번 커밋으로부터 비롯되었는데, "branch1" 브랜치를 3번 커밋이나 4번 커밋에서 뻗어나오도록 변경하는 것이 바로 "재배치"입니다.
재배치를 사용하는 이유는 병합으로 비롯되는 병합 커밋들을 보지 않기 위함입니다. Merge(병합)를 진행하면 병합 커밋 이력이 남기에 히스토리(log)에 불필요한 병합 커밋들이 남게 되는데, 재배치를 사용하면 하나의 브랜치에서 작업한 것과 같은 효과를 얻을 수 있기에 커밋 로그가 상당히 깔끔해집니다.
다만, 재배치는 다른 브랜치로 작업하는 작업자들의 커밋 히스토리를 변경해버릴 수 있기에 혼자 사용하는 브랜치나 문제 상황이 발생할 확률이 적을 때에만 사용해야 합니다.