개발 작업을 할 때, 개발자들은 작업 레파지토리에서 소스 코드를 공유합니다. 연관성이 없는 기능을 개발한다고 할 때 어떤 개발자는 A 기능을 작업하고 또 다른 개발자는 B 기능을 맡아 작업한다고 가정해보도록 하겠습니다.
만약 A 작업이 다 끝난 뒤에 B 작업을 수행한다면 연관성이 없는 기능 단위의 작업을 비효율적으로 하고 있는 것입니다. 별도로 작업하여 합치는 방안이 가장 좋을 것입니다. Git에서는 브랜치와 머지라는 명령으로 이것을 가능하게 합니다.
브랜치는 독립적인 작업을 할 수 있는 공간입니다. A 기능을 A 브랜치에서 작업하고, B 기능을 B 브랜치에서 작업하면, 서로 다른 독립적인 공간에서 작업하는 것이기 때문에 서로에게 영향을 주지 않고 작업할 수 있습니다. 메인 작업 공간의 코드를 복사한 개별적인 작업 공간을 만들고 거기서 각각의 기능 개발을 진행합니다. 그리고 작업이 완료되었을 때, 코드를 합치면 될 것입니다.
아래 그림을 보겠습니다. 개리는 기본 브랜치에서 작업중입니다. 그리고 개리1, 개리2, 개리3 이라는 커밋을 남기고있습니다. 빙키는 개리의 프로젝트에 참여하려합니다. 개리가 작업을하던 내역을 기본브랜치에서 pull받고 개리3을 커밋한 부분에서 작업 공간을 기능 브랜치로 분리합니다. 빙키는 이제 분리된 작업공간(기능 브랜치)에서 자신의 커밋을 남기며 작업을 독립적으로 진행합니다.
알잘딱깔센 GitHub
개발자는 기능 브랜치에서 작업한 내용을 기본 브랜치로 바로 커밋을 날릴 수 있고 코드를 병합(merge)하고 업데이트 할 수 있습니다. 브랜치로 작업을 하면 브랜치 단위로 업데이트가 되기 때문에 충돌이 일어나는 일을 방지하기 좋습니다.
<aside> 💡 만약 서로 같은 부분을 다르게 수정하여 합치면 어떻게 될까요? 충돌이 납니다! 충돌이 나면 둘 중 하나를 선택하라는 선택이 뜨죠. 걱정하지 않으셔도 됩니다. 되돌릴 수도 있으니까요.
</aside>
git에서의 기본 브랜치는 master 브랜치(GitHub은 main) 입니다. 기본브랜치는 git 저장소를 초기화할 때 자동으로 만들어집니다. 이때, 'HEAD'라는 특수한 포인터가 있습니다. 이 포인터는 지금 작업 중인 브랜치를 가리킵니다.
알잘딱깔센 GitHub
<aside> 💡 해당 책에서 나오는 예시에서 main 브랜치 또는 master 브랜치는 기본 브랜치를 의미합니다. master라는 단어가 노예제를 떠올리게 한다는 이유로 많은 코드에서 master 대신 main을 채택하고 있습니다.
git config --global init.defaultBranch main
명령을 통해 git에서도 GitHub처럼 기본 브랜치를 main으로 사용할 수 있습니다.
</aside>
하나의 기능 개발이 완료되면 특정 브랜치의 내용들을 main 브랜치에 합칩니다. 또 새로운 작업을 하려고 하면 main 브랜치에서 다시 새로운 feature 브랜치를 생성하고 작업합니다.
알잘딱깔센 GitHub
알잘딱깔센 GitHub
특정 기능을 작업하고 있는데 급하게 버그를 수정해야 하는 경우가 발생합니다. 이런 경우 현재의 작업 상태를 임시로 커밋해두고 이전 기능 작업 중인 상태로 브랜치(작업폴더)를 변경할 수 있습니다.
버그 패치용 브랜치를 만들고 수정 작업을 합니다. 이후 작업이 완료되면 버그 패치용 브랜치의 추가된 변경 내역을 main 브랜치에 합칠 수 있습니다. 이런 과정을 거치면 main 브랜치는 가장 최근에 배포한 소스코드의 커밋을 가리키고 있게 됩니다.