git 브랜칭 전략과 git flow


발생일: 2013.03.31

문제:
며칠 전에 Pro Git 책을 다시 읽었다.
git 은 평소에도 늘 사용하고 있고, 1년 전에도 한 번 읽었던 책인데,
처음 읽은 것처럼 새로운 내용이 많더라. ㅎㅎ

예전에 git 브랜치를 효과적으로 나누고 관리하는 방법에 대해,
홍과 Y형에게서 공유를 받은 적이 있다.

Vincent Driessen 라는 개발자가 공유한 브랜칭 방식인데,
브래칭 전략을 손쉽게 쓸 수 있게 git flow 라는 도구도 만들어놨다.

하지만 그 개념이 좀 복잡하게 느껴지기도 했고,
git은 개인 프로젝트에서만 사용하고 브랜치도 개발용만 따로 땄던 터라,
"뭐 그냥 그런 게 있군" 하고 넘어갔더랬다.

그러다 이번에 책을 다시 보고,
git flow 를 다시 살펴보니, 오~ 정말 깔끔하고 훌륭한 브랜칭 전략이다.

이 참에 자세히 정리도 하고, 프로젝트에도 적용해보려고 한다.


해결책:

먼저, 관련 링크.


git flow 도구를 바로 사용할 수도 있지만,
빈센트가 얘기하는 각 브랜치의 특징에 대해 미리 알아두는 게 좋다.


기본 브랜치

- master : 최종 릴리즈한 안정된 버전
- develop : 다음 릴리즈를 위한 개발 중인 최신 빌드

위 두 브랜치는 계속 존재한다.
아래 브랜치는 필요할 때 생성했다 master 나 develop 브랜치로 머지하고 삭제하는,
이벤트 성격의 브랜치이다.

- feature : 특정한 기능을 위한 브랜치
    - develop 브랜치에서부터 가져오며, 다시 develop 브랜치로 머지한다.
    - develop 브랜치 이외의 브랜치와는 머지하지 않는다.
    - 일반적으로 개발자의 로컬에서만 유지하고 origin 에 푸시하지 않는다.
    - develop 브랜치에 머지하면 feature 브랜치는 삭제한다.

- release : 릴리즈 점검을 위한 브랜치
    - develop 브랜치에서 가져오며, develop 과 master 브랜치로 머지한다.
    - release-* 형태로 이름을 짓는다. 예를 들어, 다음 릴리즈 버전이 1.2라면, release-1.2 라고 한다.
    - 브랜치를 생성한 후, 소스 코드 내에 버전과 관련된 값을 수정하고 커밋한다.
    - 다음 릴리즈까지 개발이 최종 완료되었다고 판단하는 시점에서 브랜치를 생성한다.
    - 릴리즈 대상이 되는 feature 는 미리 develop에 머지되어 있어야 하고,
      다음에 릴리즈할 feature 라면 develop에 머지되어 있으면 안된다.
    - release 브랜치를 생성한 이후의 버그 픽스는, develop 이 아닌 release 브랜치에서 진행한다.
    - 릴리즈가 모두 준비되었다고 생각하면, release 브랜치를 master 에 머지한다.
    - master 브랜치에서 해당 버전으로 태그를 생성한다.
    - release 브랜치에서 버그 픽스한 것들을 develop 브랜치로 머지한다.
    - release 가 종료되면, release 브랜치를 삭제한다.

- hotfix : 긴급 버그 픽스를 위한 브랜치
    - master 에서 가져오며, master 와 develop 브랜치로 머지한다.
    - hotfix-* 형태로 이름을 짓는다.
    - release 브랜치와 사용 방법은 동일하지만, 예상치 못한 긴급 버그 수정을 위해 사용한다.
    - release 와 마찬가지로, 소스 코드 내 버전 정보를 업데이트 한다.
    - 작업이 완료되면, master 에 머지하고 버전을 태그로 남긴다.
    - 수정 사항을 develop 브랜치로 머지한다.
      만약, release 브랜치가 이미 존재하면, develop이 아닌 release 브랜치로 머지한다.
    - 핫픽스가 종료되면 브랜치를 삭제한다.


몇 가지 주의할 점은 다음과 같다.

  - 브랜치를 머지할 때 --no-ff 옵션을 쓴다.

      fast forward 머징을 하지 않고, 머지 커밋을 생성하겠다는 의미다.

      머징 히스토리를 유지하기 위함이다.

  - 가능하다면 버전 정보는 소스 코드 내에서 직접 작성하지 않는다.

      버전과 관련된 정보를 찾아 현재 버전으로 업데이트하는 스크립트를 작성하자.




위와 같이 브랜치를 직접 생성하고 삭제해서 사용할 수도 있지만,

쉽게 사용할 수 있도록 도구를 만들어뒀고, 그게 git flow 이다.


맥에서는 brew 나 MacPort 로 인스톨 할 수 있다.


  $ brew install git-flow



자세한 내용은 gitflow github 을 참고하면 되고,

각 커맨드에 대한 간단한 설명은 다음과 같다.


  $ git flow init 

    git 저장소를 초기화하고 master, develop 브랜치를 생성한다.


  $ git flow feature start iss51

    develop 브랜치로부터 feature/iss51 란 이름의 브랜치를 따오고 체크아웃한다.


  $ git flow feature finish iss51

    feature/iss51 브랜치를 develop 브랜치에 머지하고, 브랜치를 삭제한다.


  $ git flow feature track iss70

    이미 origin 에 존재하는 feature/iss70 브랜치를 가져오고 체크아웃한다.




카테고리

분류 전체보기 (702)
About me. (6)
Daylogs (667)
비공개 (0)
영어공부 (0)
My works - 추억 (29)