///
Search
Duplicate
📍

Git 브랜치 전략

브랜치를 어떻게 잘 써먹어볼까에 대한 얘기를 해보기 전에 먼저 우리는 브랜치를 왜 사용할까?
개인적인 측면에선
메인 브랜치에서만 작업을 수행한다면 하나의 커밋 단위가 완성되기 전까지는 빌드가 안 되거나 불완전한 기능이 남아 있을 것이다.
협업을 하게 된다면
메인 브랜치에서 수 많은 개발자들이 협업한다면 내가 작업하고 있는 파일을 누군가가 건들게 될 것이고 충돌을 일으킬 것이다.
여러 기능을 개발하면서 남겨진 커밋 히스토리가 시간 순서대로 메인 브랜치에 뒤죽박죽 섞이게 될 것이다.
하나의 단위가 명확하게 분리되지 않았기 때문에 롤백도 어려워진다.
브랜치 기능을 사용한다면
다른 브랜치의 변경사항에 영향을 받지 않는 독립적인 환경에서 개발을 진행하거나 버그를 잡을 수 있다.
여러 기능을 여러 사람이 병렬적으로 개발할 수 있게 된다.
이처럼 이롭기만 해보이는 브랜치를 마구잡이로 사용한다면 혼란을 불러올 수 있다.
브랜치 관리에 명확한 기준이 없다면 다음과 같이 혼란을 일으킬 소지들이 있다.
이 브랜치는 어떤 목적으로 생성된거지?
이 브랜치는 어떤 커밋 시점에서 분기된거지?
어떤 브랜치에서 내 브랜치를 분기시켜야하지?
내 브랜치는 어디에 병합해야하지?
어떤 브랜치가 최신이지?
어떤 브랜치가 배포된 버전이지?
Git 브랜치 전략은 프로젝트의 Git 브랜치들을 효율적으로 관리하기 위한 워크플로우다.

Git Flow

Git Flow는 크게 Main, Develop, Supporting 브랜치로 구분하여 관리한다.
Supporting 브랜치는 또 다시 Feature, Release, HotFix 브랜치로 나뉜다.
Main 브랜치와 Devleop 브랜치는 개발 프로세스 전반에 걸쳐 항상 유지되어야하는 브랜치다.
반면 Supporting 브랜치는 필요할 때마다 생성되고 역할을 다하면 삭제된다.
Main 브랜치
출시 가능한 프로덕션 코드를 모아두는 브랜치이다.
프로젝트 시작 시 생성되며 개발 프로세스 전반에 걸쳐 유지된다. 배포된 각 버전을 Tag를 이용해 표시해둔다.
Develop 브랜치
다음 버전 개발을 위한 코드를 모아두는 브랜치이다. 개발이 완료되면 Main 브랜치로 머지된다.
Supporting 브랜치
Feature 브랜치
하나의 기능을 개발하기 위한 브랜치다.
Develop 브랜치에서 파생되며 기능이 개발 완료되면 Develop 브랜치에 머지된다.
머지할 때 주의점은 FastForward로 머지하지 않고 Merge 커밋을 생성하며 머지를 해주어야 한다. 이렇게 해야 히스토리가 특정 기능 단위로 묶인다.
네이밍은 feature/branch-name와 같이 한다.
Release 브랜치
배포를 준비하기 위한 브랜치이다.
Develop 브랜치에서 생성하며 버전 이름 등의 소소한 데이터를 수정하거나 배포 전 사소한 버그를 수정하기 위해 사용된다.
이런 작업들이 완료되었다면 Main과 Develop 브랜치에 둘다 머지한다. 이때 Main 브랜치에는 태그를 이용해 버전을 표시한다.
Release 브랜치를 따로 운영하므로써 배포와 관련 없는 팀원들은 다른 기능을 개발할 수 있다.
네이밍은 release/v1.1과 같은 형태로 생성한다.
HotFix 브랜치
이미 배포된 버전에 문제가 발생했다면 사용하는 브랜치다.
Main 브랜치에서 생성하며 문제 해결이 완료되면 Main과 Develop 브랜치에 둘다 머지한다.
네이밍은 hotfix/v1.0.1과 같은 형태로 생성한다.
Git Flow의 한계
Git Flow는 명시적으로 버전관리가 필요한 스마트폰 어플리케이션, 오픈소스 프로젝트 등에 적합하다.
웹 어플리케이션은 특성상 사용자가 항상 최신의 버전만 사용하기 때문에 여러 버전을 병렬적으로 지원할 필요가 없다.
또한 하루에 몇 번이고 배포될 수 있으므로 이런 특성상 웹 어플리케이션에 Git flow는 다소 적합하지 않다.

GitHub Flow

Main 브랜치
항상 안정된 상태여야 한다.
안정된 상태라는 것은 모든 커밋이 언제 배포되든 문제없어야 하고 브랜치를 새로 분기하더라도 문제가 없어야 한다는 것이다.
Main 브랜치의 모든 커밋은 빌드가 되고 테스트를 통과해야 한다.
GitHub Flow에서 유일하게 강제하는 사항이다.
Topic 브랜치
새로운 기능을 개발할 때는 Topic 브랜치를 Main 브랜치로부터 생성하여 사용한다.
Git Flow의 Feature 브랜치와 동일한 역할을 하며 Git Flow의 HotFix 브랜치의 역할도 수행한다.
Topic 브랜치의 네이밍은 기능을 설명하는 명확한 이름으로 결정한다.
user-content-cache, submodules-init-task, redis2-transition
Topic 브랜치의 커밋은 기능이 완성되지 않았더라도 꾸준히 푸쉬한다.
이를 통해 개발자들이 끊임없이 코드에 대한 커뮤니케이션이 가능해진다.
개발이 완성되고 풀 리퀘스트를 날리는 것이 아닌 스크린샷, 아이디어를 공유하고 싶을 때도 PR을 개설한다.
토론과 리뷰가 종료되었다면 어프로브를 받고 Main 브랜치에 Topic 브랜치를 머지한다.
이때 Topic 브랜치는 자동화된 CI 빌드를 통과해야 머지가 가능하다.
개발팀이 소규모 애자일 팀이고 제품이 하나의 배포 버전만 유지한다면 GitHub Flow가 적합하다.