git-flow

git-flow๋Š” Vincent Driessen์˜ branching model์„ ์ ์šฉํ•˜์—ฌ ๊ณ ์ˆ˜์ค€์œผ๋กœ ์ €์žฅ์†Œ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ™•์žฅ๊ธฐ๋Šฅ์ด๋‹ค. branching model์€ feature - develop - release - hofixes - master ๋‹จ๊ณ„๋กœ branch๋ฅผ ๋ˆ„๋ˆ ์„œ ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ „๋žต์ด๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™•์žฅ ๊ธฐ๋Šฅ(๋ช…๋ น์–ด)์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Git-flow์—๋Š” 5๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋ธŒ๋žœ์น˜๊ฐ€ ์กด์žฌํ•œ๋‹ค. ํ•ญ์ƒ ์œ ์ง€๋˜๋Š” ์ฃผ์š” ๋ธŒ๋žœ์น˜๋“ค(master, develop)๊ณผ ์ผ์ • ๊ธฐ๊ฐ„ ๋™์•ˆ๋งŒ ์œ ์ง€๋˜๋Š” ๋ณด์กฐ ๋ธŒ๋žœ์น˜๋“ค(feature, release, hotfix)์ด ์žˆ๋‹ค.

  • master : ์ œํ’ˆ์œผ๋กœ ์ถœ์‹œ๋  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋žœ์น˜

  • develop : ๋‹ค์Œ ์ถœ์‹œ ๋ฒ„์ „์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜

  • feature : ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜

  • release : ์ด๋ฒˆ ์ถœ์‹œ ๋ฒ„์ „์„ ์ค€๋น„ํ•˜๋Š” ๋ธŒ๋žœ์น˜

  • hotfix : ์ถœ์‹œ ๋ฒ„์ „์—์„œ ๋ฐœ์ƒํ•œ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ • ํ•˜๋Š” ๋ธŒ๋žœ์น˜

git-flow ์‹œ์ž‘ํ•˜๊ธฐ

$ git flow init

์ฃผ์š” ๋ธŒ๋žœ์น˜(main branches)

master branch

๊นƒ์—์„œ์˜ ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜์ด๋‹ค. ๋ฐฐํฌ๋˜์—ˆ๊ฑฐ๋‚˜ ๋ฐฐํฌ ์ค€๋น„๋œ ์ฝ”๋“œ๋Š” origin/master ์— ๋‘๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค. master ๋ธŒ๋žœ์น˜์— mergeํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ƒˆ๋กœ์šด ๋ฒ„์ „์„ ๋ฐฐํฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

develop branch

๋‹ค์Œ์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœํ•˜๋Š” ์ฝ”๋“œ๋Š” origin/develop ์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ํ•จ๊ป˜ ๋ณด๋ฉฐ ์—…๋ฌด๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋ธŒ๋žœ์น˜์ด๋‹ค. develop ๋ธŒ๋žœ์น˜์˜ ์ฝ”๋“œ๊ฐ€ ์•ˆ์ •ํ™”๋˜๊ณ , ๋ฐฐํฌํ•  ์ค€๋น„๊ฐ€ ๋˜๋ฉด master ์— mergeํ•˜๊ณ , ๋ฐฐํฌ๋ฒ„์ „์œผ๋กœ ํƒœ๊ทธ๋ฅผ ๋‹จ๋‹ค.

develop ๋ธŒ๋žœ์น˜๋Š” master ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘๋œ ๋ธŒ๋žœ์น˜์ด๋‹ค.

๋ณด์กฐ ๋ธŒ๋žœ์น˜(Supporting branches)

feature branch

  • ์‹œ์ž‘ ๋ธŒ๋žœ์น˜ : develop

  • ๋ณ‘ํ•ฉ(merge) ๋Œ€์ƒ ๋ธŒ๋žœ์น˜ : develop

  • Branch naming ๊ทœ์น™

    • master, develop, release-*, hotfix-* ์„ ์ œ์™ธํ•œ ์–ด๋– ํ•œ ๊ฒƒ

    • ์šฐ๋ฆฌ๋Š” ์ผ๊ฐ๋ฒˆํ˜ธ-์ผ๊ฐ์—๋Œ€ํ•œ๊ฐ„๋žตํ•œ๋‚ด์šฉ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค.

feature ๋ธŒ๋žœ์น˜๋Š” ๋ฐฐํฌํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜์ด๋‹ค. ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ๋Š” ์–ธ์ œ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์„์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค. feature ๋ธŒ๋žœ์น˜๋Š” ๊ทธ ๊ธฐ๋Šฅ์„ ๋‹ค ์™„์„ฑํ•  ๋•Œ๊นŒ์ง€ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ๋‹ค ์™„์„ฑ๋˜๋ฉด.develop ๋ธŒ๋žœ์น˜๋กœ mergeํ•œ๋‹ค.

feature branch ์ƒ์„ฑ

$ git flow feature start <branch name>

feature/branchname ์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ , ์ž๋™์œผ๋กœ ํ•ด๋‹น branch๋กœ checkout๋œ๋‹ค.

$ git checkout -b <branch name> develop

feature branch merge

$ git flow feature finish <branch name>

์ƒ์„ฑํ•œ feature branch๋ฅผ develop ๋ธŒ๋žœ์น˜์— mergeํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  feature ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•˜๊ณ , develop ๋ธŒ๋žœ์น˜๋กœ ์ „ํ™˜ํ•œ๋‹ค.

$ git checkout develop
$ git merge --no-ff myfeature
$ git branch -d myfeature

feature branch publish

$ git flow feature publish <branch name>

ํ•ด๋‹น branch๋ฅผ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์™€ ๊ณต๋™์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์›๊ฒฉ ์„œ๋ฒ„์— ์˜ฌ๋ ค์ฃผ๋ฉด๋œ๋‹ค.

feature branch pull

$ git flow feature pull origin <branch name>

๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ช…๋ น์–ด์ด๋‹ค.

release branch

  • ์‹œ์ž‘ ๋ธŒ๋žœ์น˜ : develop

  • ๋ณ‘ํ•ฉ(merge) ๋Œ€์ƒ ๋ธŒ๋žœ์น˜ : develop, master

  • Branch naming ๊ทœ์น™

    • release-*

release branch๋Š” ์‹ค์ œ ๋ฐฐํฌํ•  ์ƒํƒœ๊ฐ€ ๋œ ๊ฒฝ์šฐ์— ์ƒ์„ฑํ•˜๋Š” ๋ธŒ๋žœ์น˜์ด๋‹ค. ๋ณดํ†ต release ์ ๊ฒ€์„ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ž‘์—… ๋“ฑ์˜ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์•ˆํ•˜๊ณ  ์žˆ๋‹ค.

release branch create

$ git flow release start <version>
$ git flow release start v.0.0.1

release๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด release/<version> ์˜ ์ด๋ฆ„์„ ๊ฐ–๋Š” ์ƒˆ๋กœ์šด branch๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•˜์—ฌ checkoutํ•œ๋‹ค.

$ git checkout -b release-1.2 develop
 Switched to a new branch "release-1.2"
$ ./bump-version.sh 1.2
Files modified successfully, version bumped to 1.2.
$ git commit -a -m "Bumped version number to 1.2"
[release-1.2 74d9424] Bumped version number to 1.2
1 files changed, 1 insertions(+), 1 deletions(-)

release branch publish

release ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•œ ํ›„์—๋Š” commit์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด publish ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•˜๋‹ค.

$ git flow release publish <version>

release branch track

$ git flow release track <version>

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์›๊ฒฉ release ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค.

release branch finish

release๋ฅผ ์œ„ํ•œ ์ ๊ฒ€์ด ๋๋‚œ ๊ฒฝ์šฐ์— release๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.

$ git flow release finish <version>
$ git push --tags

release finish ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜๋ฉด 1. release ๋ธŒ๋žœ์น˜ ์ฝ”๋“œ๋ฅผ master์— merge 2. release ์ด๋ฆ„์œผ๋กœ ํƒœ๊ทธ ๋“ฑ๋ก 3. release๋ฅผ develop branch์— ์žฌ๋ณ‘ํ•ฉ(back-merge) 4. release ๋ธŒ๋žœ์น˜์‚ญ์ œ ์ˆœ์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git branch -d release-1.2

hotfix branch

  • ์‹œ์ž‘ ๋ธŒ๋žœ์น˜ : master

  • ๋ณ‘ํ•ฉ(merge) ๋Œ€์ƒ ๋ธŒ๋žœ์น˜ : develop, master

  • Branch naming ๊ทœ์น™

    • hotix-*

๋ฐฐํฌ๋ฅผ ์ค€๋น„ํ•˜๊ณ , ์ด๋ฏธ ๋ฐฐํฌํ•œ ์ œํ’ˆ์ด๋‚˜ ์„œ๋น„์Šค์˜ ๋ฒ„๊ทธ๋ฅผ ์ฆ‰๊ฐ ๋Œ€์‘(hotfix)ํ•ด์•ผํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ธŒ๋žœ์น˜์ด๋‹ค. ์ฆ‰, ๊ธด๊ธ‰ ์ˆ˜์ • ๋ธŒ๋žœ์น˜์ด๋‹ค.

hotfix branch start

$ git flow hotfix start VERSION [BASENAME]

์—ฌ๊ธฐ์„œ version์€ hotfix ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค. ์„ ํƒ์ ์œผ๋กœ basename์œผ๋กœ ์‹œ์ž‘์ ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

$ git checkout -b hotfix-1.2.1 master
Switched to a new branch "hotfix-1.2.1"
$ ./bump-version.sh 1.2.1
Files modified successfully, version bumped to 1.2.1.
$ git commit -a -m "Bumped version number to 1.2.1"
[hotfix-1.2.1 41e61bb] Bumped version number to 1.2.1
1 files changed, 1 insertions(+), 1 deletions(-)

hotfix branch finish

$ git flow hotfix fisnish VERSION

ํ•ซํ”ฝ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด ํ•ซํ”ฝ์Šค๋Š” develop ๋ฐ master ๋ธŒ๋žœ์น˜๋กœ merge๋œ๋‹ค. master ๋ธŒ๋žœ์น˜๋กœ์˜ merge ๋ถ€๋ถ„์€ ํ•ซํ”ฝ์Šค ๋ฒ„์ „์œผ๋กœ tag๋œ๋‹ค.

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2.1
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)
$ git branch -d hotfix-1.2.1
Deleted branch hotfix-1.2.1 (was abbe5d6).

git-flow vs gif-flow-avh

gif-flow ๋Š” hotfix๋ฅผ dev์™€ master์— ๊ฐ๊ฐ merge๋ฅผ ํ•œ๋‹ค. ์ฆ‰, ๊ฐ€์ง€๊ฐ€ hot fix ํ•˜๋‚˜์—์„œ dev์™€ master branch๋กœ ๋‚˜๋ˆ„์–ด์ง€๋Š” ํ˜•ํƒœ์ด๋‹ค.

git-flow-avh ๋Š” hotfix๊ฐ€ dev branch๋กœ merge๋˜๊ณ , hotfix๊ฐ€ merge๋œ dev branch๋ฅผ master branch์— mergeํ•˜๋Š” ํ˜•ํƒœ์ด๋‹ค. (hotfix > dev > master ์ˆœ์„œ, git-flow-avh๊ฐ€ ์ตœ์‹  ๋ฒ„์ „์ด๋‹ค.)

$ brew install git-flow-avh

์ฐธ๊ณ ์ž๋ฃŒ

Last updated

Was this helpful?