우아한 형제들 기술 블로그, Huns.me 등을 참조하여 작성된 글입니다.
또한 Git
과 GitFlow
에 대해 알아가는 와중에 쓴 글이기 때문에 틀린 부분이 있을 수 있습니다.
GitHub
GitHub
는 오픈소스와 여러가지 프로젝트를 위한 협업, 코드 관리를 도와주는 편리한 플랫폼이다.
현재 공동으로 진행하는 프로젝트는 없지만, 예전에 GitHub
를 사용하지 않았을 때 랩탑과 PC에서 번갈아가며 수정하던 프로젝트를 관리하기가 힘들었던 기억이 있다.
하지만 GitHub
를 사용하기 시작하면서 push
와 pull
만 제대로 해주면 이런 문제점들이 없어졌다.
또한 진행하다가 버린 프로젝트나 오랫동안 쓰지 않던 프로젝트를 찾을 때도 GitHub
로 프로젝트를 관리한다면 쉽게 찾을 수 있다는 것이 마음에 들었다.
개요
GitFlow
는 Git
에서 소프트웨어의 소스코드와 버전을 효율적으로 관리하기 위한 브랜칭 관리 전략이다.
이것은 꽤나 오래된 전략이며, 현재까지 발견된 단점을 극복하기 위해 Github Flow와 Gitlab Flow 전략이 나왔다.
결국에 이름은 거창하지만, Git
에서 제공하는 브랜칭 기능을 어떻게 효율적으로 사용할지에 대한 지침도라고 볼 수 있다.
Git Flow
GitFlow
에는 아래 5가지의 브랜치가 존재한다.
이 브랜치들은 크게 2개로 나뉘는데, 항상 유지되는 메인 브랜치(master
, develop
)와 일정 기간에만 유지되는 보조 브랜치(feature
, release
, hotfix
)가 있다.
- master : 실제 제품으로 출시 가능
- develop : 다음 출시 버전 개발
- feature : 기능 개발
- release : 이번 출시 버전 QA
- hotfix : 출시 버전에서 발생한 버그를 수정
이 그림을 위에서부터 천천히 살펴보면, 일단 처음에는 master
와 develop
브랜치가 존재한다.
develop
에는 hotfix
에서 상시로 버그를 픽스한 커밋이 추가된다.
feature
에서는 새로운 기능을 개발할 경우 develop
에서 브랜치를 생성한다.
따라서 feature
은 언제나 develop
에서 시작하게 된다.
feature
에서 개발되던 기능이 완성되었다면 develop
으로 다시 merge 되게 된다.
develop
에 이번 버전에 필요한 모든 기능이 merge 되었다면 오류를 검증하기 위해 release
를 생성하고 검증이 완료되었다면 정식 버전으로 출시하기 위해 develop
과 master
에 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 한 후,feature
을develop
로 merge하고,- 작업이 끝난
feature
을 삭제한다.
git flow feature finish <“branch name”>
release
브랜치 사용하기
release
역시 비슷하다.
단, release
는 이번 출시될 버전을 위한 QA가 목적일 뿐이다.
release
브랜치 역시 현재 develop
를 기반으로 생성된다.
git flow release start <“branch name”>
QA가 끝난 후 실제로 출시를 하기 위해 release finish
를 요청하면 다음과 같은 작업을 한다.
release
를master
에 mergerelease
이름으로 태그 등록release
를develop
에 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>