Git의 분기

완료됨

업무에 Git를 활용하는 방법에 대해 자세히 알아보려는 웹 개발자라고 가정하겠습니다. Git 기술을 연습하기 위해 고양이 사진이 있는 간단한 HTML 및 CSS 웹 사이트를 만들었고 친구인 Alice와 Bob과 함께 작업을 했습니다.

프로젝트가 진행됨에 따라 모두가 서로의 작업을 방해하지 않으면서 한 번에 두 개 이상의 작업을 수행할 수 있도록 하고 싶어졌습니다. 모든 사람의 작업을 개별적으로 유지시켜서 새로운 개발이 기존 버그 수정을 방해하지 않도록 해야 합니다. Git에서 ‘분기’를 사용하면 이러한 종류의 공동 작업을 쉽게 수행할 수 있습니다.

한 분기에서 수행된 작업을 공유하지 않아도 되며 다른 분기에서 수행된 작업을 방해하지 않습니다. 분기를 사용하면 각 토픽과 관련된 커밋을 함께 유지하고 다른 작업과 격리할 수 있으므로 토픽에 대한 변경 내용을 쉽게 검토하고 추적할 수 있습니다.

최신 소프트웨어 개발은 거의 전체가 분기에서 수행됩니다. 목표는 작업을 체크 인할 준비가 될 때까지 기본 분기를 클린하게 유지하는 것입니다. 그런 다음 기본 분기에 대한 변경 내용을 푸시하거나 변경 내용을 병합하는 끌어오기 요청을 제출합니다.

이전의 VCS(버전 제어 시스템)와 비교할 때 Git의 장점은 분기 만들기가 아주 빠르다는 것입니다. 40자 해시를 .git/heads 아래의 파일에 작성하기만 하면 됩니다. Git는 변경 내용의 목록에서 재구성을 시도하는 대신 전체 파일을 저장하고 압축을 해제하기 때문에 분기 전환도 빠릅니다. Git에서의 병합은 ‘그리’ 단순하지는 않지만 이해하기 쉽고 완전 자동일 때가 많습니다.

분기는 무엇인지, 어떻게 사용되는지 그리고 어떻게 작동하는지 알아보겠습니다.

분기 구조 및 이름 지정

‘분기’는 나무의 가지처럼 개발의 주요 라인에서 가지를 친 커밋의 체인입니다.

다른 VCS에서 Git로 전환하는 경우에는 약간 다른 용어에 익숙해져야 할 수 있습니다. VCS Subversion에서는 기본 분기를 trunk라고 하지만, Git에서는 master라고 합니다. 다른 분기의 이름을 바꿀 수 있는 것처럼 기본 분기의 이름을 바꿀 수 있습니다. 이 모듈에서는 기본 분기의 이름을 main이라고 하겠습니다.

분기는 일반적으로 기본 분기(이 경우 main)에 대한 커밋으로 시작합니다. 분기는 커밋이 추가됨에 따라 별도의 기록 체인이 증가합니다. 결국 분기의 변경 내용은 main에 다시 병합됩니다. 이 모듈에서는 분기에서 변경 내용을 커밋하고 main 분기에 병합하는 방법을 학습합니다.

main 분기에서 분기를 만든다고 가정하겠습니다. 그 내용을 시각화하는 방법은 다음과 같습니다.

A diagram that shows the relationship of the main branch and local branches.

다이어그램의 각 대문자는 커밋을 나타냅니다. 분기에는 add-authentication, fix-css-bug와 같은 이름이 지정되며 분기는 자체 분기를 가질 수 있습니다. 최종 목표는 개발자가 서로 방해하지 않으면서 필요한 작업을 수행하고 기본 분기에 관련된 모든 개발자의 최고의 결과가 반영되도록 하는 것입니다.

분기 만들기 및 전환(git 분기 및 git 체크 아웃)

새 분기를 만드는 일반적인 이유는 기존 기능을 변경하는 것입니다. 이 목적을 위한 분기는 일반적으로 토픽 분기 또는 기능 분기라고 합니다.

git branch 명령을 사용하면 새 분기를 만들 수 있습니다. git checkout 명령을 사용하여 분기 사이를 전환합니다.

인덱스에서 파일을 가져와서 작업 트리에서 파일을 대체하는 방법으로서 checkout을 이미 다룬 적이 있습니다. 인수 목록의 경로를 사용하지 않고 checkout은 작업 트리와 인덱스의 ‘모든 것’을 업데이트하여 지정된 커밋, 즉 이 경우에는 분기의 헤드와 일치시킵니다.

분기 병합(git 병합)

한 분기에서 기능 또는 버그 수정과 같은 일부 작업을 종료한 후에는 기본 분기로 해당 분기를 다시 ‘병합’하게 됩니다. git merge 명령을 사용하여 특정 분기를 현재 분기에 병합할 수 있습니다.

예를 들어 my-feature라는 분기에서 작업하고 있었다면 워크플로는 다음 예제와 같이 표시될 것입니다.

# Switch back to the main branch
git checkout main

# Merge my-feature branch into main
git merge my-feature

이러한 명령을 사용하고 ‘병합 충돌’(이 모듈의 뒷부분에서 병합 충돌에 대해 설명)을 해결하면 my-feature 분기의 모든 변경 내용이 main에 적용됩니다.