Outdated/Column

[Computer Column] Git Flow

해달 2019. 3. 20. 07:00

Git Flow란?

Vincent Driessen의 브랜칭 모델을 위한 고수준 저장소 작업을 제공하는 Git의 확장 프로그램이다. Git Flow의 설치는 여기에서 확인할 수 있고, GUI 도구인 SourceTree도 지원한다.

Git Flow

출처 : https://nvie.com/posts/a-successful-git-branching-model/

왜 사용하는가?

DVCS(destributed version control system)와 CVCS(centralized version control system)를 비교할 때, 가장 도드라지는 특징은 버전 관리 이력을 누가 가지고 있느냐일 것이다. DVCS는 그 이름답게 모든 유저가 버전 관리 이력을 가진다. 문제는 그렇다보니 브랜치가 체계적으로 관리가 되지 않아, 버전 관리가 꼬일 수 있다는 것이다. Vincent Driessen은 이런 문제를 해결하기 위해 둘의 장점을 섞어, 하나의 메인 저장소를 두고 병렬적으로 개발이 이뤄지게 모델을 만들었다.

브랜치 소개

브랜치는 메인 브랜치와 서브 브랜치로 나뉜다. 메인 브랜치는 메인 저장소에서 가지고 있으며 무한한 수명을 가진다. 반면, 서브 브랜치는 각 개발자들의 레포에만 존재하는 존재하며, 한정적인 수명을 갖고 있어 나중에는 삭제된다. 메인 브랜치는 master와 develop, 서브 브랜치는 featurereleasehotfix가 있다.

  • master : 출시 준비 상태를 가진 버전 이력이며, 어떠한 버그도 있지 않아야 한다.

  • develop : master 브랜치에서 분기돼, 개발자가 개발한 기능들이 추가되는 역동적인 브랜치이다. 일정 시점이 되면 master로 병합된다.

  • feature : develop 브랜치에서 분기돼 다시 feature로 병합되는 브랜치로, 개발자가 새 기능을 개발할 때 이용한다.

  • release : develop 브랜치에서 분기돼 다시 develop과 master로 병합되는 브랜치로, 새 버전을 출시 전 자잘한 버그 수정과 배포를 위한 메타 데이터 준비를 위해 쓰인다.

  • hotfix : master 브랜치에서 분기돼, 다시 develop과 master로 병합되는 브랜치로, 라이브 서비스 중 치명적인 버그 수정 등에 쓰인다. release 브랜치와 비슷하다.

사용 방법

로컬에서 git flow를 사용하는 법을 소개한다. 전체적으로는 [기능 개발] => [배포] => [핫픽스] 순으로 진행이 된다.

1. git flow init을 입력해 저장소를 초기화한다.

명령어 후 나오는 질문들은 각각의 브랜치를 만들 때의 접두어를 정하는 것이다.

2. git flow feature start을 입력해 새 기능 개발을 시작한다.

feature/NewFeature로 체크아웃된 것을 볼 수 있다.

3. git flow feature finish를 입력해 새 기능 개발을 끝낸다.

feature/NewFeature 브랜치가 develop에 병합되고, 사라진 걸 볼 수 있다.

4. git flow release start를 입력해 배포를 시작한다.

5. git flow release finish를 입력해 배포를 완료한다.

태그와 커밋 메시지를 입력하면, release 브랜치가 사라지고 develop과 master에 병합이 된 걸 볼 수 있다.

6. git flow hotfix start를 입력해 핫픽스를 시작한다.

7. git flow hotfix finish를 입력해 핫픽스를 완료한다.

배포 때와 마찬가지로 태그와 커밋 메시지를 입력하면, hotfix 브랜치가 사리지고 develop과 master에 병합이 된 걸 볼 수 있다.

여기서는 원격 저장소까지 같이 활용하는 방법은 소개하지 않았다. 그러나 보통 Github의 Pull Request를 이용해 코드 리뷰를 받으므로, 로컬에서 모든 작업을 끝내기 보단 게시하는 일이 많을 것이다. 몇가지 명령어를 더 쓰자면, git flow feature publicsh/pull을 이용해 원격 저장소로 브랜치를 보내거나 로컬로 가져올 수 있으며, git flow release publish/track을 이용하면 원격 저장소에 브랜치를 게시하거나 변경 추적을 할 수 있다. Git Flow 도입으로 성공적인 프로젝트 개발을 하시길 바란다.