branch (브랜치, 분기)에 대한 개념은 깃에만 존재하는 새로운 것은 아닙니다. 기존의 버전 관리 시스템에도 존재하는 개념입니다. git의 branch에 대해 알아보도록 하겠습니다.
git branch 란
branch는 하나의 프로젝트에서 분기(branch)해서 기존 코드에 영향을 주지 않고 개발을 할 수 있는 기능입니다. 예를 들어 기존에 존재하던 코드에 새로운 기능을 추가할 일이 생겼다고 생각해 봅시다. 기존 코드는 그대로 두고 본사본을 다른 곳에 놓고 작업을 하면 안전할 것입니다. 더 가까운 예로 액셀 파일이나 논문 등을 수정 시 버전별로 저장해 놓곤 합니다. 이렇게 프로젝트의 기존 코드는 유지하면서 안전하게 개발을 할 수 있는 공간이 브랜치입니다.
개발을 할 때는 하나의 브랜치에서 계속 개발하기보다는 어느 특정 시점에서 주요 개발 라인에서 분기합니다. 쭉 뻗어나가는 기차 노선에서 어느 순간 옆으로 뻗는 새로운 노선을 연상해서 생각해 보세요. 개발자들은 새로운 브랜치에서 메인 브랜치에 영향을 주지 않고 모든 종류의 작업을 할 수 있습니다. 그 사이드 브랜치에서 작업이 완료된다면 기차 길이 다시 합치지는 것처럼 다시 메인으로 수렴할 수 있습니다. 메인으로 수렴시킬 때 변경한 내용이 기본 개발 브랜치에 있는 것과 병합됩니다.
git에서 branch를 만드는 개념은 기존의 버전 관리 시스템과 다릅니다. 깃은 스냅숏을 이용하며 훨씬 더 가볍고 브랜치 생성이 매우 빠릅니다. 프로그램 개발 시 여러 브랜치를 만들어 작업을 하는 것이 좋습니다. 브랜치 생성을 비롯해 브랜치 간의 전환, 병합이 모두 빠릅니다.
git의 스냅 샷 이해하기
git은 스냅샷(snapshot)으로 작동합니다.
커밋을 할 때 모든 파일의 스냅숏이 만들어지고 모든 파일에 대해 커밋 시점의 참조가 생성됩니다. 만약 파일이 변경되지 않았다면 git은 이전의 동일한 파일에 대한 링크만 저장합니다. 이런 깃의 스냅샷은 파일간의 차이점인 델타값을 저장하는 다른 소스 코드 관리 시스템과의 주요 차이점 중 하나입니다.
git의 commit과 branch
스냅샷 개념을 이해했으니 이제 다시 브랜치 이야기와 함께 commit이야기를 하겠습니다. 깃은 커밋을 할 때마다 스냅샷에 대한 포인터를 저장합니다. 포인터라는 것은 말 그대로 어떠한 것을 가리켜 특정 값 따위를 찾게 하는 정보입니다. 우리 주변의 예로 우편번호도 포인터라고 볼 수 있습니다.
해당 포인터에 포함된 커밋 객체에는 이메일 및 커밋 메시지와 같은 항목도 포함됩니다. 또한 커밋에는 커밋에 대한 포인터도 포함됩니다. 물론 첫 번째 커밋이라면 이전 커밋이 없을 수도 있습니다.
git에서 branch는 사실 이러한 커밋 중 하나에 대한 포인터에 불과합니다. 일반적으로 git의 디폴트 브랜치는 main(예전에는 master)이며 자동으로 생성됩니다. 메인 브랜치를 통해 커밋을 하면 포인터가 우리가 만든 마지막 커밋을 가리키게 되고 그 위치는 모든 커밋의 앞이 됩니다. 따라서 이러한 포인터의 위치를 변경해주는 작업은 매우 간단한 작업이고 브랜치를 만드는 것 역시 포인터를 만드는 일 이므로 쉬운 작업입니다.
git을 사용할 때 거의 모든 기능 개발에 브랜치를 만들어 작업하는 게 일반적입니다. 버그를 수정해야 하는 경우 역시 새로운 브랜치에 버그를 수정합니다. 실험적인 코드를 적용하
고 싶을 때도 브랜치를 만들어 작업하면 됩니다.
main브랜치가 있고 커밋을 가리키고 있습니다. 새로운 branch를 만든다면 어떻게 될까요?
새로운 브랜치를 만들 때는 포인터에 불과하므로 새 포인터가 생성됩니다.
그리고 기본적으로 main브랜치에서 작업하며 새 브랜치를 생성해도 작업하는 브랜치는 변경되지 않습니다. 그럼 작업자가 어떤 branch에 있는지 추적하는데 필요한 정보가 있어야 할 것입니다. 현재 어떤 브랜치에 있는지는 특수 지점인 head를 사용하여 추적합니다.
head는 소위 체크아웃을 하여 가리키는 브랜치 변경이 가능합니다. 따라서 새로운 작업을 할 때는 브랜치를 생성하고 생성한 작업 브랜치로 체크아웃하여 일을 진행하게 됩니다. 작업 브랜치에서 작업이 끝나면 메인 브랜치로 병합(merge)합니다. 그리고 필요 없어진 브랜치는 삭제해서 깨끗하게 브랜치를 관리할 수 있습니다.
디폴트 브랜치 이름? main or master
git은 새로운 디폴트 브랜치로 main을 사용하도록 설정되어있습니다. 하지만 아직 git을 설치할 때 디폴트 브랜치 이름을 master를 사용하도록 기본 설정되어있습니다. 하지만 설치 시에 main으로 변경할 수 있습니다. github 자체도 이 디폴트 브랜치를 main으로 하고 있기 때문에 main을 사용하시는 것을 추천합니다.
여기까지 수고하셨습니다~
'프로그래밍 > Git' 카테고리의 다른 글
github, pull request 만들고 merge하기 (1) | 2022.09.16 |
---|---|
Git 브랜치 전략과 github 워크 플로 (0) | 2022.09.13 |
깃 작업 흐름, github clone부터 push까지 따라하기 (0) | 2022.09.07 |
github 리포지토리 이해하기 (0) | 2022.09.04 |
github ssh연결 설정 (0) | 2022.09.01 |
댓글