๐Ÿ’ก Git-flow๋Š” 10๋…„์ „ ์ฏค Vincent Driessen์ด๋ผ๋Š” ์‚ฌ๋žŒ์ด ๊ณ ์•ˆํ•œ Workflow๋กœ ์ž‘์—…์˜ ํ†ต์ผ์„ฑ์„ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. Git์œผ๋กœ ํ˜‘์—…ํ•˜๋ฉฐ ๊ฐœ๋ฐœ์ž๋“ค ๊ฐ๊ฐ์ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ํ•ฉ์น˜๊ณ  ๋ฐฐํฌํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” Git-flow์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


Git-flow์˜ branch

Git-flow๋Š” ์ด 5๊ฐ€์ง€์˜ branch๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • master: ๊ธฐ์ค€์ด ๋˜๋Š” branch๋กœ ์ œํ’ˆ์„ ๋ฐฐํฌํ•˜๋Š” branch์ž…๋‹ˆ๋‹ค.
  • develop: ๊ฐœ๋ฐœ์ž๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ branch๋กœ ๊ฐ๊ฐ ์ž‘์—…ํ•œ ๊ธฐ๋Šฅ(feature)๋“ค์„ ํ•ฉ์น˜๋Š” branch์ž…๋‹ˆ๋‹ค.
  • feature: ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๊ฐœ๋ฐœํ•˜๋Š” branch๋กœ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ๋˜๋ฉด develop branch์— ํ•ฉ์นฉ๋‹ˆ๋‹ค.
    • ํ•ด๋‹น branch๋Š” ๋ณดํ†ต ๊ฐœ๋ฐœ์ž ์ €์žฅ์†Œ์—๋งŒ ์žˆ๊ณ  origin์—๋Š” pushํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ํ˜น์€, ๊ธฐ๋Šฅ์„ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์™€ ๊ณต๋™์ ์œผ๋กœ ๊ฐœ๋ฐœํ•œ๋‹ค๋ฉด origin์— ๊ฒŒ์‹œํ•˜์—ฌ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • develop์— ๋ณ‘ํ•ฉ์‹œํ‚ฌ ๋•Œ --no-ff ์˜ต์…˜์„ ์ฃผ์–ด ๋ณ‘ํ•ฉ๋œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • release: master branch๋กœ ๋ณด๋‚ด์„œ ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ํ’ˆ์งˆ๊ฒ€์‚ฌ(QA)๋ฅผ ์œ„ํ•œ branch์ž…๋‹ˆ๋‹ค.
  • hotfix: master branch๋กœ ๋ฐฐํฌํ–ˆ๋Š”๋ฐ ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด ๊ธด๊ธ‰ ์ˆ˜์ •์„ ํ•˜๋Š” branch ์ž…๋‹ˆ๋‹ค.


Git-flow ์ง„ํ–‰ ๊ณผ์ •

์ดˆ๊ธฐ ์„ค์ •

์šฐ์„  ์ œ๋Œ€๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์ธ ๋กœ์ปฌ PC์— ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” Mac OS๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— Homebrew brew install git-flow-avh๋กœ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ดํ›„ git ์ €์žฅ์†Œ ๋‚ด์—์„œ git-flow๋ฅผ ์ดˆ๊ธฐํ™” ํ•ฉ๋‹ˆ๋‹ค. git flow init ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ๋ชจ๋“  ์งˆ๋ฌธ์— ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.


์ง„ํ–‰ ๊ณผ์ •


git flow init
  1. ์šฐ์„  ์‹œ์ž‘์€ master branch์—์„œ ํ•ฉ๋‹ˆ๋‹ค.
  2. develop branch๋„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. (๊ฐœ๋ฐœ์ž๋“ค์€ ํ•ด๋‹น branch์—์„œ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.)
  3. ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” feature branch๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด์„œ ํ•ด๋‹น branch์—์„œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

     git flow feature start [feature name]
    
    • ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด
     git add . (or [ํŒŒ์ผ์ด๋ฆ„])
    
     git status
    
     git commit -m ['commit msg']
    
     git push origin feature/[feature name]  ๊ธฐ๋Šฅ์„ ๋งŒ๋“  feature branch์— push
    
    • ์ž˜๋ชป ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ
     git branch -D feature/[feature name]
    

    โ†’ ์ด๋•Œ, ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ™•์‹คํžˆ ๋„ฃ์„๊ฑฐ๋ผ ํŒ๋‹จ๋  ๋•Œ merge๋ฅผ ํ•˜๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ์‹ค๋ง์Šค๋Ÿฌ์šธ ๊ฒฝ์šฐ ์•„์˜ˆ ๋ฒ„๋ฆฌ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

  4. ์™„๋ฃŒ๋œ feature branch๋Š” ๊ฒ€ํ† ๊ณผ์ •์„ ๊ฑฐ์นœ ํ›„ ๋‹ค์‹œ develop branch์— ํ•ฉ์นฉ๋‹ˆ๋‹ค.

     git flow feature finish [feature name]
    
    • develop branch๋กœ ์ž๋™ checkout
    • feature branch ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์ž๋™์„ develop branch์— merge
    • ์ž‘์—…์ด ๋๋‚œ feature branch๋ฅผ ์‚ญ์ œ

    • ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•

        git flow feature pull origin [feature name]
      
    • branch ์‚ญ์ œ

        git branch -d [branch name]
      
    • branch ๋ณ€๊ฒฝ

        git checkout [branch name]
      
    • git flow์˜ ํ˜„์žฌ branch ๋˜๋Š” feature๊ฐ€ ๋ญ๊ฐ€ ์žˆ๋Š”์ง€ ๋ณด๊ณ  ์‹ถ์„ ๋•Œ

        git flow init -f
      
  5. ๋ชจ๋“  ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์™„๋ฃŒํ•˜๋ฉด develop branch์—์„œ release branch๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

     git flow release start [release name]
    
  6. QA ๋‹ด๋‹น์ž๋“ค์€ ํ•ด๋‹น branch์—์„œ ๋ณด์™„์ ์„ ๋ณด์™„ํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ฒ„๊ทธ๋ฅผ ํ”ฝ์Šคํ•ฉ๋‹ˆ๋‹ค. (๋ฒ„๊ทธ ์ˆ˜์ • ์‚ฌํ•ญ์€ develop branch์—๋„ ์ ์šฉํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)
  7. ๋ชจ๋“  ๊ณผ์ •์ด ์™„๋ฃŒ๋˜๋ฉด release branch๋ฅผ master, develop ๊ฐ๊ฐ์˜ branch๋กœ ๋ณด๋‚ด์ค๋‹ˆ๋‹ค.

     git add . (or [ํŒŒ์ผ์ด๋ฆ„])
    
     git status
    
     git commit -m ['commit msg']
    
     git push origin release/[release name]
    
     git flow release finish [release name]
    

    ํ•ด๋‹น ๊ณผ์ •์ด ๋๋‚˜๊ณ ๋‚˜๋ฉด โ€˜masterโ€™ โ€˜origin/masterโ€™ have diverged ๋ผ๋Š” warning์ด ๋œจ๋Š”๋ฐ ์ด๋Š” master๋กœ๊ฐ€์„œ pullํ•˜์—ฌ mergeํ•ด์ฃผ๋ฉด ํ•ด๊ฒฐ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (์‚ฌ์‹ค ์—ฌ๊ธฐ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๊ฒƒ์˜ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์ด ๋งž๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๊ณ  ์™œ ์ด๋Ÿฐ ๊ฒฝ๊ณ ๊ฐ€ ๋œจ๊ฒŒ ๋˜์—ˆ๋Š”์ง€์™€ ์ด์œ ์— ๋Œ€ํ•ด์„œ ๋” ์—ฐ๊ตฌํ•ด๋ณด์•„์•ผ ํ•ฉ๋‹ˆ๋‹น..)

    • release branch๋ฅผ master branch์— ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
    • release name์œผ๋กœ tag๊ฐ€ ๋ถ™์Šต๋‹ˆ๋‹ค. - (๋ณดํ†ต ๋ฒ„์ „์„ ํ‘œ์‹œ?)
    • develop branch๋กœ ์žฌ๋ณ‘ํ•ฉ(back-merge)ํ•ฉ๋‹ˆ๋‹ค.
    • release branch๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  8. merge๋œ develop branch์—์„œ ์›๊ฒฉ ์ €์žฅ์†Œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

     git push origin develop
    

    ์ด๋Ÿฌ๊ณ  ๋‚˜๋ฉด, master branch์— pull request๊ฐ€ ๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ๊ทธ๋Ÿฌ๋ฉด master branch์—์„œ๋Š” merge ์ž‘์—…์„ ์ง„ํ–‰ํ•ด์ฃผ๊ณ  ๋กœ์ปฌํ™˜๊ฒฝ์—์„œ pull์„ ํ•ด์ค๋‹ˆ๋‹ค.

  9. master branch์—์„œ๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ฒ„์ „ ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. release ๋ช…์œผ๋กœ tag๊ฐ€ ์ƒ์„ฑ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

     git push --tags
    
  10. ๋ฐฐํฌ ์™„๋ฃŒ ํ›„ ๋ฏธ์ฒ˜ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ master์—์„œ hotfix branch๋ฅผ ์ƒ์„ฑํ•ด์„œ ๊ธด๊ธ‰ ์ˆ˜์ •ํ•œ ํ›„ ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ”๋กœ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • hotfix ์‹œ์ž‘
    git flow hotfix start [hotfix name] (์ผ๋ฐ˜์ ์œผ๋กœ ๋ฒ„์ „์ •๋ณด๋ฅผ ์”๋‹ˆ๋‹ค.)
    
    git add . (or [ํŒŒ์ผ์ด๋ฆ„])
    
    git status
    
    git commit -m ['commit msg']
    
    git push origin hotfix/[hotfix name]
    
    • hotfix ์™„๋ฃŒ
    git flow hotfix finish [hotfix name]
    


๊ทธ ์™ธ์—..


github-flow

github-flow๋Š” github๊ฐ€ Hub์˜ ์„ฑ๊ฒฉ์œผ๋กœ ์˜คํ”ˆ ์†Œ์Šค๊ฐ€ ๊ณต์œ  ๋˜๊ณ , ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์ด pull request๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•˜๋‹ค๋Š” ์˜๊ฒฌ์œผ๋กœ ์ƒ๊ธด workflow์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋‹ค๋ฅธ branch๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ์˜ค์ง main branch ๋งŒ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋‹จ, main branch์— ์—„๊ฒฉํ•œ ๊ถŒํ•œ์„ ๋‘๊ธฐ ๋•Œ๋ฌธ์— pull request์— ์—„๊ฒฉํ•˜๋‹ต๋‹ˆ๋‹ค.


gitlab-flow

gitlab-flow๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ github-flow์™€ ๊ฑฐ์˜ ๋น„์Šทํ•˜์ง€๋งŒ ์ถ”๊ฐ€๋กœ ์ž๋™๋ฐฐํฌ ๊ธฐ๋Šฅ(CI/CD) ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • CI/CD: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ๋‹จ๊ณ„๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ์งง์€ ์ฃผ๊ธฐ๋กœ ๊ณ ๊ฐ์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋•Œ๋ฌธ์—, main branch ํ•˜๋‚˜๋งŒ ๋‘๊ณ  ์ž‘์—…ํ•˜๊ธฐ์—๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ• ์ง€๋„ ๋ชจ๋ฅด๋Š” ์ƒํ™ฉ ๋•Œ๋ฌธ์— ๋ถˆ์•ˆ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ! release branch ๋ฅผ ๋‘๊ณ  ํ•ด๋‹น branch์—์„œ ๋ชจ๋“  ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ • ํ•œ ํ›„ main branch๋กœ merge๋ฅผ ์ง„ํ–‰ํ•ด ์ž๋™๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜๋„๋กํ•˜๋Š” workflow์ž…๋‹ˆ๋‹ค.




์ฐธ๊ณ 

https://danielkummer.github.io/git-flow-cheatsheet/index.ko_KR.html