๐ŸŽ git flow / trunk-based ๋ธŒ๋žœ์น˜ ์ „๋žต

์œ ์ง„ยท2025๋…„ 5์›” 26์ผ

git

๋ชฉ๋ก ๋ณด๊ธฐ
11/13

์—ฌ๋Ÿฌ ๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์‹œ์— ํ˜‘์—…ํ•  ๋•Œ ๋ธŒ๋žœ์น˜๋ฅผ ๋งˆ์Œ๋Œ€๋กœ ํ•ฉ์น˜๊ณ  ๋งŒ๋“ค๊ณ  ๊ทธ๋Ÿฌ๋ฉด ๊ฐœ๋ฐœ ๊ณผ์ •์ด ๋ณต์žกํ•ด์ง€๊ณ  ์ถ”์ ์ด ์–ด๋ ค์›Œ์ง„๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด git flow, trunk-based, github flow ๋“ฑ ๋‹ค์–‘ํ•œ ๋ธŒ๋žœ์น˜ ๋ฐฉ๋ฒ•๋ก  ๊ฐ™์€ ๊ฒŒ ์กด์žฌํ•œ๋‹ค.

์ด๋Ÿฐ ์ „๋žต์„ ์ ์šฉํ•˜๋ฉด ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์›Œ์ง€๊ณ  ํŒ€์›์ด ๋งŽ์•„๋„ ๊ฐœ๋ฐœ ์ ˆ์ฐจ๊ฐ€ ๋งค๋„๋Ÿฌ์›Œ์ง„๋‹ค.

ํ‰์ƒ ์‹œํ‚ค๋Š” ๊ฒƒ๋งŒ ํ•˜๋Š” ์ฝ”๋”ฉ ๋…ธ์˜ˆ๊ฐ€ ์ž๊ธฐ ๊ฟˆ์ด๋‹ค! ์‹ถ์œผ๋ฉด ๋ชฐ๋ผ๋„ ๋˜๊ณ ,
ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌ๋“œํ•˜๊ฑฐ๋‚˜ ํŒ€์žฅ์ด๋ผ๋ฉด ํ˜น์€ ๊ทธ๋Ÿฐ ๊ฒƒ๋“ค์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•Œ์•„๋‘๋ฉด ์ข‹๋‹ค.


์•ˆ์ •์ ์ธ ์šด์šฉ git flow ๊ฐœ๋ฐœ ์ „๋žต

ํ•ญ์ƒ ์•ˆ์ •์ ์ธ release๋ฅผ ํ•ด์•ผํ•œ๋‹ค๋ฉด ์ด ์ „๋žต์ด ์ ํ•ฉํ•˜๋‹ค.
์ฃผ์š” ๋ธŒ๋žœ์น˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  • main ๋ธŒ๋žœ์น˜
  • develop ๋ธŒ๋žœ์น˜ (๊ฐœ๋ฐœ์šฉ)
  • feature ๋ธŒ๋žœ์น˜ (develop์— ๊ธฐ๋Šฅ์ถ”๊ฐ€์šฉ)
  • hotfix ๋ธŒ๋žœ์น˜ (main ๋ธŒ๋žœ์น˜ ๋ฒ„๊ทธํ•ด๊ฒฐ์šฉ)
  • ๊ฐ€๋” release ๋ธŒ๋žœ์น˜ (develop ๋ธŒ๋žœ์น˜๋ฅผ main ๋ธŒ๋žœ์น˜์— ํ•ฉ์น˜๊ธฐ ์ „์— ์ตœ์ข… ํ…Œ์ŠคํŠธ์šฉ)

๊ฐ•์˜์—์„  ์ด๋ก ๋งŒ ํ•˜๋‚˜ํ•˜๋‚˜ ์„ค๋ช…์„ ํ•˜๋ฉด ์žฌ๋ฏธ๊ฐ€ ์—†๋‹ค๋ฉฐ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด์„œ ์„ค๋ช…ํ•œ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„๋“ค์€ ์ง€๊ธˆ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ ํŒ€์žฅ์ด๋‹ค.

๋Œ€์ถฉ ์ง€๊ธˆ๊นŒ์ง€ ์ฃผ๋จน๊ตฌ๊ตฌ์‹์œผ๋กœ ํ˜‘์—…ํ•ด์„œ 0.9๋ฒ„์ „๊นŒ์ง€ ๋‚˜์˜จ ์ƒํ™ฉ์ด๋‹ค.

๊ทผ๋ฐ ์ด์ œ 1.0 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ์‹ ๊ธฐ๋Šฅ๋„ ๋งŽ์•„์ ธ์„œ ์ œ๋Œ€๋กœ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค.

๊ทธ๋ž˜์„œ git flow๋ฅผ ๋„์ž…ํ•˜๊ธฐ๋กœ ํ•œ ๊ฒƒ์ด๋‹ค.

๊ธฐ์กด main ๋ธŒ๋žœ์น˜์— 0.9๋ฒ„์ „์ด ์žˆ๋‹ค๊ณ  ์น˜์ž.

  1. develop ๋ธŒ๋žœ์น˜
    • ๊ธฐ์กด 0.9๋ฒ„์ „ main ๋ธŒ๋žœ์น˜๋ฅผ ๋ณต์‚ฌํ•ด develop ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ ๋‹ค.
    • ๋ชจ๋“  ๊ฐœ๋ฐœ์€ develop์—์„œ ์ง„ํ–‰ํ•œ๋‹ค.

๊ทผ๋ฐ develop ๋ธŒ๋žœ์น˜์—๋‹ค๊ฐ€ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ๋ง‰ pushํ•ด๋ฒ„๋ฆฌ๋ฉด ์ƒํ™ฉ์ด ์–ด์ง€๋Ÿฌ์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ž˜์„œ ์‹ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์€ feature ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด ๊ฐœ๋ฐœํ•œ๋‹ค.

  1. feature ๋ธŒ๋žœ์น˜
    • ๊ธฐ๋Šฅ๋ณ„๋กœ develop์—์„œ feature ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ์„œ ๊ฐœ๋ฐœํ•œ๋‹ค.
      ์˜ˆ๋ฅผ ๋“ค์–ด feature/guild, feature/friend์™€ ๊ฐ™์ด ๋งŒ๋“ค์–ด์„œ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•œ๋‹ค.
    • ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์ด ๋๋‚˜๋ฉด develop์— mergeํ•œ๋‹ค.
    • ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋ธŒ๋žœ์น˜๋Š” squash and merge๋„ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด์ œ develop์— ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์–ด๋А์ •๋„ ์™„์„ฑ์ด ๋œ ๊ฒƒ ๊ฐ™๋‹ค.

์ด์ œ ์ถœ์‹œ๋ฅผ ํ•˜๊ณ  ์‹ถ์€๋ฐ, ์ƒ๋‚จ์ž๋‹ต๊ฒŒ ๋ฐ”๋กœ main ๋ธŒ๋žœ์น˜์— ํ•ฉ์ณ๋„ ๋˜๊ฒ ์ง€๋งŒ
์šฐ๋ฆฌ ์ฝ”๋“œ๋Š” ์ƒ๊ฐ๋ณด๋‹ค ์—ฐ์•ฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ์•ˆํ•œ ๊ฒƒ์ด ํ˜„์‹ค์ด๋‹ค.

๊ทธ๋ž˜์„œ ๊ฒ์Ÿ์ด ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ค€๋‹ค.

  1. release ๋ธŒ๋žœ์น˜
    • develop์—์„œ release ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด ์ตœ์ข… ํ…Œ์ŠคํŠธ๋‚˜ QA๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
    • ๋Œ€๊ฐœ release/1.0 ์ด๋Ÿฐ ์‹์œผ๋กœ ์ด์˜๊ฒŒ ์ด๋ฆ„์„ ์ง“๋Š”๋‹ค.
    • ํ…Œ์ŠคํŠธ ํ›„ main์— mergeํ•˜์—ฌ ๋ฐฐํฌํ•˜๊ณ , ๋‹ค์Œ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด develop์—๋„ mergeํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์œ ์ €๋“ค์ด ๊ณจ๋“œ ๋ฌดํ•œ ๋ณต์‚ฌ ๋ฒ„๊ทธ ์ด๋Ÿฐ ๊ฑธ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๊ณ  ์น˜์ž.

์ด๋Ÿด ๋• ์ƒ๋‹นํžˆ ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— main ๋ธŒ๋žœ์น˜์—์„œ ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ๋น ๋ฅด๊ฒŒ ์ˆ˜์ •ํ•œ๋‹ค

์ด๊ฒŒ ๋ฐ”๋กœ hotfix ๋ธŒ๋žœ์น˜๋‹ค.

  1. hotfix ๋ธŒ๋žœ์น˜
    • ์šด์˜ ์ค‘ ๋ฐœ๊ฒฌ๋œ ๋ฒ„๊ทธ๋Š” main์—์„œ hotfix ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด ์ฆ‰์‹œ ์ˆ˜์ •ํ•œ๋‹ค.
    • ์ˆ˜์ • ํ›„ main๊ณผ develop์— ๋ชจ๋‘ mergeํ•œ๋‹ค.

๋ฌผ๋ก  ์œ ์ €๋“ค์€ ์ ๊ฒ€์ด๋‚˜ ์—…๋ฐ์ดํŠธ ์ด๋Ÿฐ ๊ฑฐ ์•ˆ ์ข‹์•„ํ•˜๋‹ˆ๊นŒ
์ ๊ฒ€ ๋ณด์ƒ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์ชผ๊ฐ€๋ฆฌ๋“ค์„ ์ฑ™๊ฒจ์ค˜์„œ ๋ฏผ์‹ฌ์„ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•˜์ž.

git flow์˜ ํŠน์ง•

์ด๋ ‡๊ฒŒ git flow๋Š” ์•ˆ์ •์ ์œผ๋กœ ๋ฒ„์ „ ๋ณ„ ๋ฐฐํฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, CI/CD ๊ฐ™์€ ๊ฑฐ ํ•˜๋Š” ๊ณณ์€ ๋ณ„๋กœ ์ ์ ˆ์น˜ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

(CI/CD๋Š” CI ๋‹จ๊ณ„์—์„œ ๋นŒ๋“œ๋˜๊ณ  ํ…Œ์ŠคํŠธ๋œ ํ›„, ๋ฐฐํฌ ์ค€๋น„ ์ƒํƒœ๊ฐ€ ํ™•์ธ๋˜๋ฉด ๊ฐœ๋ฐœ์ž ํ˜น์€ ๊ฒ€์ฆํŒ€์ด ์ˆ˜๋™์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค)

์•„๋ฌดํŠผ ๊ทธ๋ž˜์„œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ, ๋ฆด๋ฆฌ์ฆˆ ๊ด€๋ฆฌ๊ฐ€ ์ค‘์š”ํ•œ ์„œ๋น„์Šค์—” ์ ํ•ฉํ•˜๋‹ค.


Trunk-based ๊ฐœ๋ฐœ ์ „๋žต

Trunk-based๋Š” ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด "๋ธŒ๋žœ์น˜ ํ•˜๋‚˜๋งŒ ์ž˜ํ•˜์ž"๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ธŒ๋žœ์น˜ ๊ตฌ์„ฑ์„ ์‚ดํŽด๋ณด๋ฉด

  • main (trunk)
  • ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค feature/* ๋ธŒ๋žœ์น˜๋งŒ ์ž ๊น ์ƒ์„ฑ

์ด์ •๋„๋กœ ์šด์˜๋œ๋‹ค.

๋Œ€์ถฉ ์šด์˜ ๋ฐฉ์‹์„ ๋” ์ƒ์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•ด๋ณด๋ฉด

  • ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋‚˜ ๋ฒ„๊ทธ ํ”ฝ์Šค๋Š” main์—์„œ feature ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ์„œ ๊ฐœ๋ฐœํ•˜๊ณ ,
    ๊ฐœ๋ฐœ์ด ๋๋‚˜๋ฉด main์— merge ํ›„ ๋ธŒ๋žœ์น˜ ์‚ญ์ œํ•˜๋ฉด ๋œ๋‹ค.

  • main ๋ธŒ๋žœ์น˜์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ๋ฐฐํฌํ•œ๋‹ค.

์ด์ •๋„๋กœ ๋ณด๋ฉด ๋œ๋‹ค.

Trunk-based์˜ ํŠน์ง•

Trunk-based์˜ ํŠน์ง•์€ ๋ธŒ๋žœ์น˜๊ฐ€ main๊ณผ feature๋ฐ–์— ์—†์–ด์„œ ๋‹จ์ˆœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ฆฌ๊ฐ€ ์‰ฝ๊ณ , merge ์ถฉ๋Œ์ด ์ ๋‹ค.

์ฝ”๋“œ๊ฐ€ ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์—ฌ์•ผ ํ•˜๋ฏ€๋กœ ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์น˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ๊ฐ™์€ ๊ฑธ ํ•ด์•ผ ํ•˜๊ณ  ์ฝ”๋“œ๋ฆฌ๋ทฐ๋„ ์ž์ฃผ ํ•ด์•ผ ํ•œ๋‹ค.


ํ‘œ๋กœ ์ •๋ฆฌํ•ด๋ณด๋ฉด

๊ตฌ๋ถ„git flowTrunk-based
๋ธŒ๋žœ์น˜ ๊ตฌ์กฐmain, develop, feature, release, hotfix ๋“ฑmain(trunk), feature๋งŒ ์ผ์‹œ์ ์œผ๋กœ
๋ฆด๋ฆฌ์ฆˆ ๊ด€๋ฆฌ์ฒด๊ณ„์ , ๋‹จ๊ณ„์ ๋น ๋ฅธ ๋ฐฐํฌ, ํ†ตํ•ฉ
๋ณต์žก์„ฑ๋ธŒ๋žœ์น˜ ๋งŽ์Œ๋‹จ์ˆœํ•จ
์ ํ•ฉํ•œ ํŒ€/์ƒํ™ฉ๋Œ€๊ทœ๋ชจ, ์•ˆ์ •์„ฑ ์ค‘์‹œ, ์ฒด๊ณ„์  ๊ด€๋ฆฌ ํ•„์š”์†Œ๊ทœ๋ชจ, ๋น ๋ฅธ ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ
๋‹จ์ ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ ๋ณต์žก, merge ์ถฉ๋Œ ๊ฐ€๋Šฅํ…Œ์ŠคํŠธ ๋งŽ์ด, ์ž์ฃผํ•ด์•ผ ํ•จ

๋งˆ๋ฌด๋ฆฌ

ํ”„๋กœ์ ํŠธ ํŠน์„ฑ, ํŒ€ ๊ตฌ์„ฑ, ๋ฐฐํฌ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ „๋žต์„ ์œ ์—ฐํ•˜๊ฒŒ ์„ ํƒํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์–ด๋А์ •๋„ ๊ฐœ๋ฐœ์ด ์ง„์ฒ™๋๊ฑฐ๋‚˜, ํŒ€์— ํ”„๋กœ ์ฝ”๋”ฉ ์ „์‚ฌ ์ด๋Ÿฐ ๋ถ„๋“ค์ด ๊ฐ€๋“ํ•˜๋ฉด trunk-based ์ด๋Ÿฐ ๊ฒŒ ๋” ํŽธํ•˜๋‹ค. (์ตœ๊ทผ CI/CD ํ˜•์‹์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ํŒ€๋“ค์€ ๋ณดํ†ต trunk-based๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค)

์•ˆ์ •์„ฑ์ด ์ค‘์š”ํ•˜๊ฑฐ๋‚˜ ์•„์ง ๋ผˆ๋Œ€๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ์—ฐ๊ตฌ์‹ ํ”„๋กœ๊ทธ๋žจ์ด๋ฉด git flow์ „๋žต์ด ์ ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ฌผ๋ก  ์ •ํ•ด์ง„ ๊ฑด ์—†๋‹ค)

ํ›—๋‚  ๊ฐœ๋ฐœ์ž๋“ค ๊ด€๋ฆฌํ•˜๋Š” ๊ด€๋ฆฌ์ž ์ด๋Ÿฐ ๊ฒŒ ๋œ๋‹ค๋ฉด ์œ ์šฉํ•˜๊ฒŒ ์จ๋จน์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.
๊ทธ๋•Œ ๋ญ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ํˆด ์ด๋Ÿฐ ๊ฒŒ ๋‚˜์˜ฌ ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ์ง€๋งŒ ์ผ๋‹จ ์•Œ์•„๋‘๋ฉด ์ข‹์œผ๋‹ˆ ๊ณต๋ถ€ํ•ด๋‘ฌ์„œ ๋‚˜์  ๊ฑด ์—†๋‹ค๊ณ  ์—ฌ๊ธด๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€