git flow

[git flow] git flow 직접 사용해보기 (feat. 터미널 히스토리)

framecreator 2021. 12. 20. 09:49

git-flow 사례

 

 

1. git-flow를 소개하면... 

 

  git-flowVincent Driessen가 "A successful git branching model"이라는 글에서 제안한 브랜치 모델을 일일이 구현하지 않아도 몇 개의 압축된 명령어로 자동으로 구현할 수 있도록 하는 git의 확장이다.

  프로젝트 개발을 시작해서 릴리즈 하는 과정에서 각 브랜치별로 목적을 세분화하고 각 목적을 다한 브랜치는 병합 후 자동 삭제되도록 실행된다. 또한 버전별로 릴리즈 되어 완성될 때마다 버전별로 최종 결과물을 담는 master branch가 처음에 따로 생성되고 주 개발은 develop branch를 중심으로 진행되면서 각 branch마다 기능과 역할을 달리하여 여러 개발자가 협업을 하기에 편하고 프로세스 관리에 용이하도록 설계되어 있다.

 

   Vincent Driessen가 "A successful git branching model" 글은 아래에서 확인할 수 있다.

 

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

 

A successful Git branching model

In this post I present a Git branching strategy for developing and releasing software as I’ve used it in many of my projects, and which has turned out to be very successful.

nvie.com

 

이 글에서는 git 명령어로 일일이 수동으로 구현하는 과정이 소개되어 있다. 이 과정을 각 branch와 단계별로 자동 실행되도록 체계화하여 따로 git flow용 명령어를 개발해놓은 git의 확장이 git flow이다.

 

2 . git-flow 위로 흘러가는 branch들을 소개하면...

 

 

 

   git flow 에서는 Vincent Driessen의 branch 모델에 따라 기본 branch로  master branch, develop branch, feature branch, release branch, hotfix branch 이름으로 기본 설정되어 있으며 기본 설정 이름은 바꿀 수 있다.

  git-flow를 설치해서 이름을 미리 지정해 놓는 과정을 거치면 기본적으로 master branch, develop branch가 생성되게 된다.

  develop branch는 기본적으로 개발을 진행하는 branch이다. master branch에는 배포될 완성 소스 코드들이 버전별로 그리고 버그 수정될 때마다 담기게 된다. check-out을 통해 branch 간에 이동을 하게 되는데 check-out도 각 과정에 따라 git-flow에서 자동적으로 전환해준다.

  feature branch는 기능을 따로 개발하는 branch이다. 각 기능별로 이름을 붙여서 개발하고 나중에 finish 명령어를 통해 자동 삭제되고 develop branch로 merge되도록 git-flow에서 설계되어 있다. 각 기능별로 기능 이름을 붙여서 branch를 관리하고 리뷰하고 병합하기에 매우 편리하여 소스 코드 관리도 쉽게 할 수 있다.

release branch는 1.0, 2.0과 같이 버전별로 이름을 붙여서 각 버전마다 각 버전을 명시하여 생성하고 버그 수정 개발을 진행하는 branch이다. finish 명령어를 통해 master branch에 완성된 코드가 담기고 다시 develop branch에도 자동 병합된 이후 각 버전별 release branch는 자동 삭제되도록 설계되어 있다. 

  hotfix branch정기적인 릴리즈 이외에 긴급한 버그 수정을 위해 생성되는 브랜치다. hotfix branch의 개발 사항은 master branch에 merge되고 릴리즈 버전을 명시하는 태그가 생성된다. 태그 생성 이후 develop branch로도 다시 병합된다. 

 

3 . git-flow 사용방법

(1) git-flow 설치 어렵지 않아요. (정말?)

 

git-flow 설치 명령어(맥)

 

brew install git-flow-avh

 

 

맥에서는 git-flow를 설치하려면  Homebrew가 설치되어 있어야 한다.

 

 

Homebrew가 설치 명령어(맥)

 

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

 

[터미널 ver] (1) 터미널에서 git-flow 설치하기

 

직접 git-flow를 터미널에서 설치하면 아래 화면과 같이 진행된다.

 

터미널에서 git-flow 설치하기(1)

 

 

 

터미널에서 git-flow 설치하기(2)

 

 

(2)  git-flow 일단 시작하면 된다.

git-flow 초기화 명령어

 

나중에 생성할 여러 브랜치 이름을 지정하여 git flow를 시작할 수 있도록 해주는 명령어이다.

 

git flow init

 

터미널에 git flow init을 입력하면 Vincent Driessen 모델의 브랜치 이름을 미리 지정할 수 있게 된다. 엔터키를 누르지 않고 브랜치 이름을 다르게 입력할 수도 있다. 위에서 살펴본 바와 같이 Vincent Driessen의 branch 모델에 따라 기본 branch로  master branch, develop branchfeature branchrelease branchhotfix branch 이름으로 기본 설정되어 있으며 기본 설정 이름은 바꿀 수 있다. 터미널에서 git flow init을 실행하면 다음과 같이 진행된다.

 

[터미널 ver]  (2)  터미널에서  git-flow init 실행하기

 

git-flow init 명령어 실행
master branch, develop branch , feature branch , release branch , hotfix branch

 

(3) 현재의 브랜치를 확인하는 명령어

 

현재의 브랜치를 확인하는 명령어

 

git branch

 

git-flow를 진행하면서 현재 생성된 브랜치의 이름과 갯수, 현재 위치하고 있는 브랜치 이름을 확인할 수 있다.

 

[터미널 ver] (3) 터미널에서 수시로 현재의 브랜치를 확인하기

이 상태에서는 브랜치 이름들만 지정하고 시작 단계이므로 git branch 명령어를 터미널에서 입력하면 develop branch와 main branch만 생성되어 있고 develop branch에 있는 것을 알 수 있다.

 

git branch 명령어

 

 

develop branch, master branch

 

 (4) 기능 개발을 위해  feature branch 를 생성하고 병합해볼까?

 

1) feature branch 를 생성하기

 

feature branch 생성 명령어

 

git flow feature start [feature branch name]

 

  따로 하나의 기능을 개발하기 위한 branch를 만들 수 있다. 기능을 개발하는 feature branch를 생성하기 위한 명령어이다. [feature branch name]을 갖는 feature branch가 생성된다. [feature branch name]을 갖는 feature branch로 자동 이동된다. 

 

 

여러 개발자들과 함께 프로젝트를 하는 경우 github 원격 저장소에 feature branch를 push해야한다.

 

원격 저장소에 feature branch를 push하는 명령어

 

git flow feature publish [feature branch name]

 

원격 저장소에서 feature branch를 가져오는 명령어

 

git flow feature pull origin [feature branch name]

 

[터미널 ver] 1)  터미널에서 첫번째 feature branch 생성하기

터미널에서 직접 nullsafety라는 이름의 feature branch를 생성하면 다음과 같이 진행된다.

git branch 명령을 실행하면 현재의 branch로 develop branchfeature/nullsafety branch, master branch가 있고 현재 feature/nullsafety branch에 있다는 것을 알 수 있다.

 

 

feature branch/nullsafety 생성하기

 

2) feature branch 를 마무리하기

feature branch에서 기능 개발을 마쳤을 때의 명령어 

 

git flow feature finish [feature branch name]

 

원래의 develop branch에  feature branch의 개발 코드를 merge 하고  develop branch로 돌아오게 된다. 그리고 feature branch는 삭제된다.

 

 

 

[터미널 ver]  2) 터미널에서 첫번째 feature branch 를 마무리하기

 

터미널에서 feature/nullsafety  branch에서의 기능 개발을 마치고 커밋한 후에 git flow feature finish nullsafety 명령어를 치게 되면 아래와 같이 진행된다.

 

feature branch git flow finish 명령어(1)

 

 

feature branch git flow finish 명령어(2)

 

git branch 명령어를 치면 아래와 같이 확인할 수 있다.   feature branch의 개발 코드를 merge 하고  develop branch로 돌아오며 feature branch는 삭제되기 때문에 develop branchmain branch만 남아 있고 develop branch에 있는 것을 알 수 있다.

 

 

터미널에서 develop branch에서 이어서 개발을 진행하고 커밋을 진행하였다. 현재 develop branch에 있으므로 develop branch에 커밋된다.

 

 

develop branch에서 이어서 개발하고 커밋하기

 

[터미널 ver]   3) 터미널에서 두번째 feature branch 생성하기

 

   터미널에서 또다른 추가 기능을 개발하기 위해 두번째의 다른 feature branch를 추가해 주었다.

 

 

터미널에서 직접 calculator라는 이름의 feature branch를 생성하면 다음과 같이 진행된다. git branch 명령을 실행하면 현재의 branch로 develop branchfeature/calculator branch, master branch가 있고 현재 feature/calculator branch에 있다는 것을 알 수 있다.

 

feature branch/calculator  생성하기

 

 터미널에서 두번째의 다른 feature/calculator branch로 자동 이동 된 상태에서 calculator 기능 개발을 하고 feature/calculator branch에 커밋을 하였다.  

 

feature/caculator branch에서 기능 개발과 커밋하기

 

[터미널 ver]  4) 터미널에서 두번째 feature branch 마무리하기

 

터미널에서 calculator 기능 개발을 하고 feature/calculator branch에 커밋이 모두 완료된 이후  git flow feature finish calculator 명령어를 통해 두번째 feature branch에서의 기능 개발을 마무리 하였다. 아래와 같이 원래의 develop branch에  feature/calculator branch의 개발 코드를 merge 하고  develop branch로 돌아오게 된다. 그리고 feature/calculator branch는 삭제된다.

 

 

feature/calculator branch 마무리하기

 

 

(5)  hotfixes  branch 를 생성하고 병합해볼까?

 

긴급 패치를 위한 hotfixes branch 생성 명령어

 

git flow hotfix start [hotfixes branch version]

$ git flow hotfix start <version>

이 명령어를  수행하면 입력한 hotfixes branch version의 hotfixes branch 가 생성된다. master branch에서부터 생성되며 긴급 패치 내용을 개발하는 branch이다.

 

hotfixes branch 에서 긴급 패치 개발을 마쳤을 때의 명령어 

 

git flow hotfix finish [hotfixes branch version]

 

이 명령어를 실행하면 hotfixes branchmaster branch에 merge하고 hotfixes branch 버전을 태그로 생성한다. 이후에  hotfixes branchdevelop branch에 병합하고 hotfixes branch를 삭제한다. 

 

 (6) 기능 개발을 위해  release  branch 를 생성하고 병합해볼까?

 

1) release branch 를 생성하기

release branch 생성 명령어

 

git flow release start [release branch version]

 

[release branch version]의 release branch가 생성된다. release branch로 이동하게 된다.

 

 

여러 개발자들과 함께 프로젝트를 하는 경우 github 원격 저장소에 release branch를 push해야한다.

 

원격 저장소에 release branch를 push하는 명령어

 

git flow release publish [release branch version]

 

원격 저장소에서 release branch를 가져오는 명령어

 

git flow release track origin [release branch version]

 

[터미널 ver] 1) 터미널에서 1.0버전 release branch 를 생성하기

터미널에서서 1.0 버전의 release branch를 생성하기 위해 git flow release start 1.0 명령어를 입력하였다. 아래와 같이 release/1.0 branch가 생성되고 release branch로 이동된다.

 git branch 명령어를 통해 현재 develop branchrelease/1.0 branch, master branch가 있고 현재 release/1.0 branch에 있다는 것을 알 수 있다. 이 상태에서 작은 오류를 수정 개발하여 release branch에 커밋을 진행하였다.

 

생성된 release/1.0 branch에서 개발하고 커밋하기

 

2) release branch 를 마무리하기

 

release branch를 마무리하는 명령어

 

git flow release finish [release branch version]

 

 

이 명령어를 실행하면 release branchmaster branch에 merge하고 release branch 버전을 태그로 생성한다. 이후에  release branchdevelop branch에 병합하고 release branch를 삭제한다. 

 

[터미널 ver]  2) 터미널에서 release branch 를 마무리하기

 

  작은 오류 수정 개발까지 release/1.0 branch에 커밋하고 완료 되어 생성한 release/1.0 branch를 마무리하는 git flow release finish 1.0 명령어를 터미널에서 실행하였다. release/1.0 branch를 master branch에 merge하고 release branch 1.0을 태그로 생성한다. 이후에  release/1.0 branch를 develop branch에 병합하고 release/1.0 branch를 삭제한다. 

 

release/1.0 branch 마무리하기

 

git branch 명령어를 통해 현재 develop branch master branch가 있고 현재 develop branch로 결국 돌아왔다는 것을 알 수 있다.

 원격 저장소에 태그도 같이 반영되려면 git push -- tags를 수행해야 한다.

 

원격 저장소에 tag를 반영하는 명령어

 

git push -- tags

 

여러 branch가 있을 때 원격 저장소에 여러 branch를 원격 저장소에 푸쉬하려면 git push oringin -- all 명령어를 수행해야 한다.

 

branch가 여럿일 때 모두 push하는 명령어

 

git push oringin -- all

 

 

원격 저장소에 푸쉬하기

 

 원격 저장소에 현재의 branch인 develop branch master branch가 있고 tag도 반영된 걸 볼 수 있다.

 

터미널에서 실행한 git-flow가 반영된 원격저장소

 

 

https://github.com/frame-creator/gitflow_android_project 레포지토리에서 자세한 내용을 확인할 수 있다.

 

 

참고 글

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

https://soft.plusblog.co.kr/20

https://techblog.woowahan.com/2553/