booknu PS & Algorithms, Tech Blog

깃 플로우(Git Flow) - 효율적인 GitHub 브랜칭 전략

2019-01-25
booknu

우아한 형제들 기술 블로그, Huns.me 등을 참조하여 작성된 글입니다.

또한 GitGitFlow에 대해 알아가는 와중에 쓴 글이기 때문에 틀린 부분이 있을 수 있습니다.

GitHub

GitHub는 오픈소스와 여러가지 프로젝트를 위한 협업, 코드 관리를 도와주는 편리한 플랫폼이다.

현재 공동으로 진행하는 프로젝트는 없지만, 예전에 GitHub를 사용하지 않았을 때 랩탑과 PC에서 번갈아가며 수정하던 프로젝트를 관리하기가 힘들었던 기억이 있다.

하지만 GitHub를 사용하기 시작하면서 pushpull만 제대로 해주면 이런 문제점들이 없어졌다.

또한 진행하다가 버린 프로젝트나 오랫동안 쓰지 않던 프로젝트를 찾을 때도 GitHub로 프로젝트를 관리한다면 쉽게 찾을 수 있다는 것이 마음에 들었다.

개요

GitFlowGit에서 소프트웨어의 소스코드와 버전을 효율적으로 관리하기 위한 브랜칭 관리 전략이다.

이것은 꽤나 오래된 전략이며, 현재까지 발견된 단점을 극복하기 위해 Github FlowGitlab Flow 전략이 나왔다.

결국에 이름은 거창하지만, Git에서 제공하는 브랜칭 기능을 어떻게 효율적으로 사용할지에 대한 지침도라고 볼 수 있다.

Git Flow

GitFlow에는 아래 5가지의 브랜치가 존재한다.

이 브랜치들은 크게 2개로 나뉘는데, 항상 유지되는 메인 브랜치(master, develop)와 일정 기간에만 유지되는 보조 브랜치(feature, release, hotfix)가 있다.

  • master : 실제 제품으로 출시 가능
  • develop : 다음 출시 버전 개발
  • feature : 기능 개발
  • release : 이번 출시 버전 QA
  • hotfix : 출시 버전에서 발생한 버그를 수정

GitFlow 이미지

이 그림을 위에서부터 천천히 살펴보면, 일단 처음에는 masterdevelop 브랜치가 존재한다.

develop에는 hotfix에서 상시로 버그를 픽스한 커밋이 추가된다.

feature에서는 새로운 기능을 개발할 경우 develop에서 브랜치를 생성한다.

따라서 feature은 언제나 develop에서 시작하게 된다.

feature에서 개발되던 기능이 완성되었다면 develop으로 다시 merge 되게 된다.

develop에 이번 버전에 필요한 모든 기능이 merge 되었다면 오류를 검증하기 위해 release를 생성하고 검증이 완료되었다면 정식 버전으로 출시하기 위해 developmaster에 merge를 한다.

즉, master은 실제 출시된 버전이고, develop에서는 다음 버전을 위한 개발이 진행되고, 그것에 필요한 각각의 기능은 feature에서 개발되며, hotfix는 이미 출시된 버전에서 발생한 버그를 픽스하여 현재 개발중인 develop과 현재 출시된 master에 제출하는 역할이고, release는 다음 버전에 대한 기능이 모두 추가되었을 때 실제로 출시하기 전 QA를 위한 브랜치인 것이다.

사용법

GitFlow설치법은 이 링크에 나와있다.

Window의 경우 Git Bash를 사용한다는 가정 하에 아래 명령어를 통해 gitflow를 clone해오면 된다.

git clone –recursive git://github.com/nvie/gitflow.git

시작하기 (init)

GitFlow를 적용할 repo에서 다음 명령어를 입력하면 위에서 말한 5개의 브랜치와 거기에 추가적으로 support라는 브랜치를 사용할 수 있는데, 이것은 버전 호환성 문제 처리를 위한 브랜치이다.

git flow init

명령어를 입력하면 메인 브랜치의 이름을 입력하라는 메세지와 보조 브랜치들의 이름을 입력하라는 메세지가 나오는데 아무것도 입력하지 않고 엔터를 누르면 기본값으로 정해진다.

만약 모두 기본값으로 설정하고 싶다면 -d 옵션을 붙이면 된다.

git flow init -d

초기화를 완료하면 master 외에 develop가 생긴다.

feature브랜치 사용하기

기본적으로 생성된 브랜치는 master, develop 두 개 뿐이고 새로운 기능 개발을 위해 feature이 필요하면 다음 명령어를 통해 만들어야 한다.

그리고 이 feature브랜치는 위에서 설명했듯이 항상 현재 develop을 기반으로 생성된다.

git flow feature start <“branch name”>

feature에서 새로운 기능 개발을 완료했다고 가정하고 이것을 GitFlow에 알려주면 GitFlow는 다음과 같은 행동을 한다.

  • develop로 checkout 한 후,
  • featuredevelop로 merge하고,
  • 작업이 끝난 feature을 삭제한다.

git flow feature finish <“branch name”>

release브랜치 사용하기

release역시 비슷하다.

단, release는 이번 출시될 버전을 위한 QA가 목적일 뿐이다.

release브랜치 역시 현재 develop를 기반으로 생성된다.

git flow release start <“branch name”>

QA가 끝난 후 실제로 출시를 하기 위해 release finish를 요청하면 다음과 같은 작업을 한다.

  • releasemaster에 merge
  • release 이름으로 태그 등록
  • releasedevelop에 back-merge(재병합)
  • release 삭제

이렇게 하면 모든 release 준비가 끝났으므로 pull 요청으로 remote repo에 코드를 제출하면 된다.

기타

이 밖에도 hotfix, feature/release 별로 pull/push를 할 수 있다.

git flow hotfix git flow hotfix start <release>[<base>] git flow gotfix finish <release> git flow feature publish <name> git flow feature pull <remote> <name>

링크

git-flow cheatsheet

우아한 형제들 기술 블로그

Huns.me


Comments

Content