Git / Git Workflow

niireymikยท2024๋…„ 1์›” 9์ผ
0

๐Ÿ’ก
์šฐ๋ฆฌ๋Š” ํ‰์†Œ ์†Œ์Šค์ฝ”๋“œ๋‚˜ ๋ฌธ์„œ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ, ๋„ˆ๋ฌด ๋งŽ์€ ๋ณต์‚ฌ๋ณธ์ด ์žˆ๋‹ค๊ฑฐ๋‚˜, ์ˆ˜์ •๋ณธ์—์„œ ์›๋ณธ์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ณ  ์‹ถ์€๋ฐ ์–ด๋ ต๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ์ƒํ™ฉ์  ๋ฌธ์ œ๋ฅผ ์ข…์ข… ๋งˆ์ฃผํ•œ๋‹ค. ์ด๋Ÿด ๋•Œ์—๋Š” '๋ฒ„์ „ ๊ด€๋ฆฌ'๋ฅผ ํ†ตํ•ด ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ์•Œ์•„๋ณผ Git๋„ '๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ'์— ์†ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์šฐ์„  '๋ฒ„์ „ ๊ด€๋ฆฌ'์™€ '๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ'์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ณ , Git๊ณผ Git Workflow์— ๊ด€ํ•ด์„œ ํŒŒํ—ค์ณ ๋ณด์ž.


๐Ÿ“Œ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ

๋ฒ„์ „ ๊ด€๋ฆฌ

: ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€ ๋ณด์ˆ˜ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์†Œ์Šค ์ฝ”๋“œ, ๋ฌธ์„œ ๋“ฑ์˜ ์ƒ์„ฑ, ๋ณ€๊ฒฝ ์ด๋ ฅ, ์‚ญ์ œ ์ด๋ ฅ ๋“ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฒ„์ „ ๊ด€๋ฆฌ์˜ ํ•„์š”์„ฑ

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์˜ ์ƒํ™ฉ์—์„œ ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•จ์„ ์ธ์ง€ํ•œ๋‹ค.

  • ๋„ˆ๋ฌด ๋งŽ์€ ๋ณต์‚ฌ๋ณธ์ด ์žˆ์–ด ์–ด๋–ค ๊ฒƒ์ด ์ตœ์‹  ํŒŒ์ผ์ธ์ง€, ์–ด๋–ค ๋ฒ„์ „์ด ์–ด๋–ป๊ฒŒ ์ˆ˜์ •๋œ ๊ฒƒ์ธ์ง€ ์•Œ๊ธฐ ์–ด๋ ต๋‹ค.
  • ์ž˜ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋‹ค๊ฐ€ ์›์ธ์„ ์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์„œ, ์ด์ „ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ€๊ณ  ์‹ถ์€๋ฐ ์ˆ˜์ •์‚ฌํ•ญ์ด ๋งŽ์ด ๋Œ์•„๊ฐˆ ์ˆ˜๊ฐ€ ์—†๋‹ค.
  • ์—ฌ๋Ÿฌ ๋ช…์ด์„œ ๋™์‹œ์— ์ž‘์—…์„ ํ•  ๋•Œ, ์—ฌ๋Ÿฌ ๋ช…์ด ๋™์‹œ์— ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด ์˜ค๋ฅ˜ ๋˜๋Š” ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค(ํ˜น์€ ๋™์‹œ์— ํŽธ์ง‘ํ•  ์ˆ˜ ์—†์–ด ํ•œ์ฐธ ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์•ผ ํ–ˆ๋‹ค).
  • ์—ฌ๋Ÿฌ ๋ช…์ด์„œ ์ž‘์—…์„ ํ•  ๋•Œ, ๋ˆ„๊ฐ€ ์–ด๋–ค ๋ถ€๋ถ„์„ ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค.

๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(VCS, Version Conrtol System)

: ํŒŒ์ผ ๋ณ€ํ™”๋ฅผ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๊ธฐ๋กํ–ˆ๋‹ค๊ฐ€ ๋‚˜์ค‘์— ํŠน์ • ์‹œ์ ์˜ ๋ฒ„์ „์„ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ์ด๋‹ค. ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์€ ํฌ๊ฒŒ Local VCS, Centralized VCS, Distributed VCS๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  • ๋กœ์ปฌ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(Local VCS)
    ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ด์šฉํ•ด ํŒŒ์ผ์˜ ์ด๋ ฅ(๋ณ€๊ฒฝ ์ •๋ณด)์„ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์ด๋‹ค. ๋Œ€ํ‘œ์ ์ธ VCS์ธ RCS(Revision Control System)์€ ํŒŒ์ผ์—์„œ ๋ณ€๊ฒฝ๋˜๋Š” ๋ถ€๋ถ„(Patch)๋งŒ ๊ธฐ์–ตํ•ด๋‘๊ณ , ๋ฒ„์ „ ๋ณ€๊ฒฝ์€ ํ•ด๋‹น ๋ฒ„์ „๊นŒ์ง€์˜ ์ผ๋ จ์˜ ๋ณ€ํ™”๋“ค(Patch Set)์„ ์ ์šฉ/ํ•ด์ œํ•˜๋Š” ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

  • ์ค‘์•™ ์ง‘์ค‘์‹ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(CVCS, Centralized VCS)
    ํŒŒ์ผ ๋ฐ ๋ณ€๊ฒฝ ์ด๋ ฅ ๋“ฑ์„ ์„œ๋ฒ„๋กœ ์˜ฎ๊ฒจ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์ด๋‹ค. ์ค‘์•™์˜ ์„œ๋ฒ„๊ฐ€ ํŒŒ์ผ๋“ค๊ณผ ์ด๋“ค์˜ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ๊ด€๋ฆฌํ•˜๊ณ , ๊ฐ ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์ ‘์†ํ•ด์„œ ํŠน์ • ๋ฒ„์ „์˜ ์Šค๋ƒ…์ƒท(snapshot)์„ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ SVN(SubVersion), CVS(Concurrent Versions System) ๋“ฑ์ด ์žˆ๋‹ค.
    ์ค‘์•™ ์ง‘์ค‘์‹ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์˜ ๋ฌธ์ œ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • ๋ชจ๋“  ๋ฒ„์ „ ๊ด€๋ฆฌ ๊ด€๋ จ ๋™์ž‘์€ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๊ฐ€ ํฌ๋‹ค.
    • ์„œ๋ฒ„๊ฐ€ ์ฃฝ๊ฑฐ๋‚˜ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.
    • ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
    • ๋ชจ๋“  ๋ฒ„์ „ ๊ด€๋ฆฌ ๊ด€๋ จ ๋™์ž‘์€ ์ ์–ด๋„ ํ•œ ๋ฒˆ ์„œ๋ฒ„๋ฅผ ๊ฒฝ์œ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค. ํ•˜๋‹ค๋ชปํ•ด ๋กœ๊ทธ๋ฅผ ๋ณด๋Š” ๊ฒƒ์กฐ์ฐจ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์™€์•ผ ํ•˜๋ฏ€๋กœ ๋Š๋ฆฌ๋‹ค.
    • ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ง๊ฐ€์ง€๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜๋ฉด ๋ณต๊ตฌํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ต๋‹ค.
  • ๋ถ„์‚ฐ์‹ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(DVCS, Distributed VCS)
    ์„œ๋ฒ„๊ฐ€ ํŒŒ์ผ ๋ฐ ๋ณ€๊ฒฝ ์ด๋ ฅ ๋“ฑ์„ ๋…์ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ฐ ํด๋ผ์ด์–ธํŠธ๋“ค์ด ๋ชจ๋‘ ์„œ๋ฒ„์˜ ๋ฐฑ์—…๋ณธ์„ ๊ฐ€์ง€๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ Git, Mecurial, Bazaar ๋“ฑ์ด ์žˆ๋‹ค.


๐Ÿ’ก
๋ถ„์‚ฐ์‹ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ๋„ ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๊ณ , ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ด๋Š” ๊ฒƒ์ด Git์ด๋‹ค. Git์ด ๋ฌด์—‡์ด๊ณ , ์–ด๋–ค ํŠน์ง•์„ ๊ฐ€์ง€๋Š”์ง€ ์•Œ์•„๋ณด์ž.


๐Ÿ“Œ Git

Git์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋ฆฌ๋ˆ…์Šค๋กœ ์œ ๋ช…ํ•œ ๋ฆฌ๋ˆ„์Šค ํ† ๋ฅด๋ฐœ์ฆˆ๊ฐ€ 2005๋…„์— ๊ฐœ๋ฐœํ•œ ๋ถ„์‚ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์œผ๋กœ, ์ปดํ“จํ„ฐ ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๋ช…์˜ ์‚ฌ์šฉ์ž๋“ค ๊ฐ„์— ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์กฐ์œจํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ฆ‰, ์ฃผ๋กœ ์—ฌ๋Ÿฌ ๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋‚˜์˜ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•  ๋•Œ, ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

Git์˜ ํŠน์ง•

  • ๋กœ์ปฌ์ €์žฅ์†Œ์— ์ €์žฅ ํ›„ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ์ž‘์—…์€ ๋กœ์ปฌ์—์„œ ์ง„ํ–‰ํ•˜๊ณ , ์—…๋กœ๋“œ๋งŒ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.
  • ๊ฐ๊ฐ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ Branch์—์„œ ๊ฐœ๋ฐœํ•œ ๋’ค, ๋ณธ ํ”„๋กœ๊ทธ๋žจ์— ํ•ฉ์น˜๋Š” Merge ๋ฐฉ์‹์„ ํ†ตํ•œ ๋ณ‘๋ ฌ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    (Branch์™€ Merge๋ฅผ ์ด์šฉํ•˜๊ธฐ์— ๋™์‹œ ์—…๋กœ๋“œ ์‹œ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ๋„ ๋‚ฎ์Œ)
  • ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ๋˜์ง€ ์•Š์€ ๊ณณ์—์„œ๋„ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ถ„์‚ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์•™ ์ €์žฅ์†Œ๊ฐ€ ์‚ญ์ œ๋˜์–ด๋„ ์›์ƒ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ด ์ž˜ ์ œ๊ณต๋˜์–ด, ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๋‹ค.

Git์˜ ๊ธฐ๋ณธ ์šฉ์–ด

  • Repository : ์ €์žฅ์†Œ // ์ €์žฅ์†Œ๋Š” ํžˆ์Šคํ† ๋ฆฌ, ํƒœ๊ทธ, ์†Œ์Šค์˜ ๊ฐ€์ง€์น˜๊ธฐ ํ˜น์€ branch์— ๋”ฐ๋ผ ๋ฒ„์ „์„ ์ €์žฅํ•œ๋‹ค. ์ž‘์—…์ž๊ฐ€ ๋ณ€๊ฒฝํ•œ ๋ชจ๋“  ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Working Tree : ์ €์žฅ์†Œ๋ฅผ ์–ด๋Š ํ•œ ์‹œ์ ์„ ๋ฐ”๋ผ๋ณด๋Š” ์ž‘์—…์ž์˜ ํ˜„์žฌ ์‹œ์ 
  • Staging Area : ์ €์žฅ์†Œ์— ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ์ปค๋ฐ‹์„ ์ค€๋น„ํ•˜๋Š” ์œ„์น˜ // ์ปค๋ฐ‹ํ•˜๊ณ  ์‹ถ์€ ํŒŒ์ผ์„ ๋„ฃ์–ด๋‘๋Š” ๊ณณ์ด๋‹ค.
  • Commit : ํ˜„์žฌ ๋ณ€๊ฒฝ๋œ ์ž‘์—… ์ƒํƒœ๋ฅผ ์ ๊ฒ€์„ ๋งˆ์น˜๋ฉด ํ™•์ •ํ•˜๊ณ  ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋Š” ์ž‘์—… // ์ฆ‰, ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • Head : ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ branch
  • Branch : ๊ฐ€์ง€ ๋˜๋Š” ๋ถ„๊ธฐ์  // ์ž‘์—…์„ ํ•  ๋•Œ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ Branch์—์„œ ์ž‘์—…์„ ํ•œ ํ›„์— ์™„์ „ํ•˜๋‹ค ์‹ถ์„ ๋•Œ ๋ณ‘ํ•ฉ(merge)ํ•œ๋‹ค.
  • Merge : ๋‹ค๋ฅธ Brabch์˜ ๋‚ด์šฉ์„ ํ˜„์žฌ Branch๋กœ ๊ฐ€์ ธ์™€ ํ•ฉ์น˜๋Š” ์ž‘์—…

Git์˜ ๊ธฐ๋ณธ ๋ช…๋ น์–ด

  • git help : ๋„์›€๋ง ๊ธฐ๋Šฅ(๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” 21๊ฐœ์˜ ๊นƒ ๋ช…๋ น์–ด ์ถœ๋ ฅ). 'git help [๋ช…๋ น์–ด]'๋ฅผ ์ž…๋ ฅ ์‹œ, ํ•ด๋‹น ๊นƒ ๋ช…๋ น์–ด์˜ ์„ค์ •๊ณผ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋„์›€๋ง ์ถœ๋ ฅ
  • git init : Git ์ €์žฅ์†Œ(repository)๋ฅผ ์ดˆ๊ธฐํ™”
  • git status : ์ €์žฅ์†Œ ์ƒํƒœ ์ฒดํฌ
  • git branch : ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ
  • git add : 'staging ์˜์—ญ'์— ๋ณ€๊ฒฝ ๋‚ด์šฉ ์ถ”๊ฐ€ // ๋‹ค์Œ commit ๋ช…๋ น ์ „๊นŒ์ง€ ๋ณ€๊ฒฝ๋ถ„์„ staging ์˜์—ญ์— ๋ณด๊ด€ํ•ด ๋ณ€๋™ ๋‚ด์—ญ์„ ์ €์žฅํ•ด ๋‘”๋‹ค.
  • git commit : staging area์— ์žˆ๋Š” ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฌถ๊ณ  ์ •์˜
  • git log : ์ปค๋ฐ‹ ๋‚ด์—ญ ํ™•์ธ
  • git push : ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ ์„œ๋ฒ„๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ "push"
  • git pull : ์„œ๋ฒ„ ์ €์žฅ์†Œ๋กœ๋ถ€ํ„ฐ ์ตœ์‹  ๋ฒ„์ „์„ "pull"
  • git clone : ์„œ๋ฒ„ ์ €์žฅ์†Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ์ปฌ ์ปดํ“จํ„ฐ๋กœ ๋ณต์‚ฌ (์„œ๋ฒ„ ์ €์žฅ์†Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ด) (cf. ํ”„๋กœ์ ํŠธ์— ์ฒ˜์Œ ํˆฌ์ž…๋  ๋•Œ ์‚ฌ์šฉ)
  • git checkout : ์ž‘์—…ํ•˜๊ธฐ ์›ํ•˜๋Š” ๋ธŒ๋žœ์น˜๋กœ ์ด๋™
  • git merge : ๊ฐœ๋ณ„ branch์—์„œ ๋งˆ์นœ ์ž‘์—…์„ master branch๋กœ ๋ณ‘ํ•ฉ

// ๋กœ์ปฌ ์ €์žฅ์†Œ์— ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” commit, ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ ์„œ๋ฒ„๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณด๋‚ด๋Š” push๋Š” ๋‹ค๋ฅธ ๊ฐœ๋…์ด๋‹ค. commit๊ณผ push๋ฅผ ํ˜ผ๋™ํ•˜์ง€ ์•Š๋„๋ก ์œ ์˜ํ•˜์ž.


๐Ÿ“Œ Git Workflow

Git์€ ๋ธŒ๋žœ์น˜๋กœ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, ํŒ€์—์„œ ๋ธŒ๋žœ์น˜๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ์ง€์— ๋Œ€ํ•ด ์ •ํ•ด๋‘” ๊ทœ์น™์„ Workflow๋ผ๊ณ  ํ•œ๋‹ค. Git์„ ์‚ฌ์šฉํ•œ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ Workflow๋Š” Git flow, Github flow, Gitlab flow๊ฐ€ ์žˆ๋‹ค.

Git flow

๋ธŒ๋žœ์น˜์˜ ์—ญํ• ์ด ๋ช…ํ™•ํ•˜๊ณ  ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•œ workflow์ด๋‹ค. 5๊ฐœ์˜ ๋ธŒ๋žœ์น˜๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ 2๊ฐœ์˜ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์ธ master, develop๊ณผ 3๊ฐœ์˜ ๋ณด์กฐ ๋ธŒ๋žœ์น˜์ธ feature, release, hotfix๋กœ ๋‚˜๋‰œ๋‹ค.

  • master
    ์ œํ’ˆ์œผ๋กœ ์ถœ์‹œํ•˜๋Š” ๋ธŒ๋žœ์น˜, ์‹ค์ œ ๋ฐฐํฌ ์ค‘์ธ ์ƒ์šฉ ๋ฒ„์ „์ด๋‹ค.
  • develop
    ๋‹ค์Œ ์ถœ์‹œ ๋ฒ„์ „์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜, ์‹ค์ œ ์ž‘๋™ ์ค‘์ธ ๋ฒ„์ „์˜ ๋‹ค์Œ ๋ฒ„์ „์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ธ ์ŠคํŠธ๋ฆผ์ด๋‹ค.
  • feature
    ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜๋กœ, ์‹ค์ œ ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ธŒ๋žœ์น˜์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ (develop ๋ธŒ๋žœ์น˜์—์„œ ๋ป—์–ด ๋‚˜์™€) ๊ธฐ๋Šฅ๋ณ„ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๋งˆ์น˜๋ฉด develop ๋ธŒ๋žœ์น˜๋กœ ํ•ฉ์ณ์ง„๋‹ค.
  • release
    ์ƒˆ๋กœ์šด ๋ฒ„์ „์„ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ๋ธŒ๋žœ์น˜์ด๋‹ค. develop์—์„œ ๋ป—์–ด ๋‚˜์™€ ๋‹ค์‹œ develop์œผ๋กœ ํ•ฉ์ณ์ง€๊ฑฐ๋‚˜ ๋ฐฐํฌ ์ค€๋น„๊ฐ€ ๋๋‚ฌ์œผ๋ฉด master๋กœ ํ•ฉ์ณ์ง„๋‹ค. ์ฃผ๋กœ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋””๋ฒ„๊น…๋งŒ ์ปค๋ฐ‹ํ•œ๋‹ค.
  • hotfix
    ์ƒ์šฉ ์ œํ’ˆ์—์„œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ธŒ๋žœ์น˜์ด๋‹ค. ๋ฒ„๊ทธ ํ”ฝ์Šค๋ฅผ ์œ„ํ•œ ๋ธŒ๋žœ์น˜๋กœ ๋””๋ฒ„๊น…๋งŒ ์ปค๋ฐ‹ํ•˜๋ฉฐ, ๋ณดํ†ต ์ผํšŒ์„ฑ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. master ๋ธŒ๋žœ์น˜์—์„œ ๋ป—์–ด ๋‚˜์™€ ๋ฒ„๊ทธ๋ฅผ ๋ชจ๋‘ ์ˆ˜์ •ํ•˜๋ฉด master์™€ develop์— ํ•ฉ์ณ์ง„๋‹ค(merge).

โœ… Git flow์˜ ์ž‘์—… ๊ณผ์ •
1. ๊ฐœ์ธ ์ž‘์—…์€ develop์—์„œ feature ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ์„œ ์ž‘์—…ํ•œ๋‹ค. ๊ฐœ์ธ ์ž‘์—…์ด ๋๋‚˜๋ฉด develop์— ๋ณ‘ํ•ฉํ•œ๋‹ค.
2. develop ๋ธŒ๋žœ์น˜์—์„œ ๋ฐฐํฌ ์ค€๋น„๊ฐ€ ๋๋‚˜๋ฉด release ๋ธŒ๋žœ์น˜๋กœ ๋ถ„ํ• ํ•œ๋‹ค.
3. release ๋ธŒ๋žœ์น˜์—์„œ ๋””๋ฒ„๊น…ํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉด master์™€ develop ๋ธŒ๋žœ์น˜์— ํ•ฉ์นœ๋‹ค.
4. master ๋ธŒ๋žœ์น˜๋ฅผ ๋ฐฐํฌํ•œ๋‹ค.
5. ๋งŒ์•ฝ ๋ฐฐํฌ ๋ฒ„์ „์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ ๊ธ‰ํ•˜๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋ฉด hotfix ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ์„œ ์ž‘์—…ํ•œ๋‹ค.
6. hotfix์—์„œ ๋ฒ„๊ทธ ํ”ฝ์Šค๊ฐ€ ๋๋‚˜๋ฉด master์™€ develop์— ํ•ฉ์นœ๋‹ค.


Github flow

ํ•˜๋‚˜์˜ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์ธ master ๋ธŒ๋žœ์น˜๋ฅผ ์ค‘์ ์œผ๋กœ ์šด์šฉํ•˜๋ฉฐ pull request๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์˜ workflow์ด๋‹ค.
(+ pull request๋Š” "์ž‘์—…ํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋‹ˆ ๋‚ด ๋ธŒ๋žœ์น˜๋ฅผ pullํ•ด ๊ฒ€ํ† , ๋ณ‘ํ•ฉํ•ด๋‹ฌ๋ผ"๋ผ๋Š” ์˜๋ฏธ)

  • github flow๋Š” ๋ธŒ๋žœ์น˜์˜ ์šฉ๋„๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฅ˜๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์–ด๋–ค ์ž‘์—…์„ ์œ„ํ•œ ๋ธŒ๋žœ์น˜์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ feature ๋ธŒ๋žœ์น˜์˜ ์ž‘์—…์€ local ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹Œ ์›๊ฒฉ ์ €์žฅ์†Œ์— ์ €์žฅํ•œ๋‹ค.

โœ… Github flow์˜ ์ž‘์—… ๊ณผ์ •
1. ๊ฐœ์ธ ์ž‘์—…์€ feature ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•˜๋ฉฐ ์ž‘์—…์ด ๋๋‚˜๋ฉด pull request๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
2. pull request์—์„œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ›„์— ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉด master ๋ณ‘ํ•ฉํ•œ๋‹ค.
3. master์— ๋ณ‘ํ•ฉํ•˜๋ฉด ๋ฐ”๋กœ ๋ฐฐํฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. (CI ์ž๋™ํ™” ๊ถŒ์žฅ?)


Gitlab flow

master์™€ develop 2๊ฐœ์˜ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์˜ workflow์ด๋‹ค. ์ด๋Š” ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์˜ ๋ฒ„์ „์„ ์œ ์ง€ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ ๋ฐฐํฌ ๋ฒ„์ „๊ณผ ๊ฐœ๋ฐœ ๋ฒ„์ „์„ ๋”ฐ๋กœ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

์—…๋กœ๋“œ์ค‘..

โœ… Gitlab flow์˜ ์ž‘์—… ๊ณผ์ •
1. develop ๋ธŒ๋žœ์น˜๋Š” githubflow์˜ develop ๋ธŒ๋žœ์น˜์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค. (ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์˜ ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ ์ž‘์—…์„ ํ•˜๋Š” ๋ฉ”์ธ ๋ธŒ๋žœ์น˜)
2. develop ๋ธŒ๋žœ์น˜๊ฐ€ ๋ฐฐํฌ๋˜๊ธฐ ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด master ๋ธŒ๋žœ์น˜์— mergeํ•œ๋‹ค.


๐Ÿ“Œ Merge ์ „๋žต

Git์€ ํ•œ ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•œ ๋‚ด์šฉ์„ Main ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ(Merge)ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋“ค์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•๋“ค์„ Merge ์ „๋žต์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

Merge Commit [3-way Merge]

: ๋ชจ๋“  ๋ธŒ๋žœ์น˜์˜ commit log์™€ merge log๊ฐ€ ๋™์‹œ์— ๊ธฐ๋ก๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ธฐ๋ณธ ๋จธ์ง€๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š” Create a merge commit์€, ๋ชจ๋“  ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹์ด ํžˆ์Šคํ† ๋ฆฌ์— ๊ธฐ๋ก๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ปค๋ฐ‹ ์ •๋ณด๋ฅผ ์ƒ์„ธํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ๊ทธ๋งŒํผ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

Squash and Merge

: ์—ฌ๋Ÿฌ ๊ฐœ์˜ commit์„ ํ•˜๋‚˜๋กœ ํ•ฉ์นœ ํ›„ mergeํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ž‘์—… ์™„๋ฃŒ๋œ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹์€ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์œผ๋กœ ๋ชจ๋‘ ํ•ฉ์ณ์ ธ main ๋ธŒ๋žœ์น˜์— ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์œผ๋กœ ๊ธฐ๋ก๋˜๊ณ , ๊ธฐ์กด์˜ ์ž‘์—… ์™„๋ฃŒ๋œ ๋ธŒ๋žœ์น˜๋Š” ์‚ญ์ œ๋œ๋‹ค. Create a merge commit๊ณผ ๋น„๊ตํ•˜์ž๋ฉด, ์ƒ์„ธํ•œ ์ปค๋ฐ‹ ๊ธฐ๋ก์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์žƒ์„ ์ˆ˜ ์žˆ์œผ๋‚˜ ๊ทธ๋งŒํผ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.

Rebase and Merge

: Rebase ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ๋ธŒ๋žœ์น˜๋ฅผ mergeํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ์‹ ๊ทœ branch์˜ ์‹œ์ž‘์ ์„ main์˜ ๊ฐ€์žฅ ์ตœ๊ทผ ์ปค๋ฐ‹์œผ๋กœ (๊ฐ•์ œ๋กœ) ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค. rebase ๋•๋ถ„์— merge๋œ ์ดํ›„์˜ ๋กœ๊ทธ๋ฅผ ๋ณด์•˜์„ ๋•Œ ํ•˜๋‚˜์˜ ๋ธŒ๋žœ์น˜์—์„œ ์—ฐ์†์ ์œผ๋กœ ์ž‘์—…ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋ฉฐ, ์ด ๋•Œ๋ฌธ์— ์–ผ๋งˆ๋“ ์ง€ ํ•ญ์ƒ ์›ํ•˜๋Š” ์ˆ˜์ค€์œผ๋กœ rollback์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ•์ œ์„ฑ์„ ๊ฐ€์ง€๋Š”๋งŒํผ, (rebase ์ž‘์—…์ด ํ•„์š”ํ•ด์ง€๋Š” ์ƒํ™ฉ์—) ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋Œ์„ ์ž˜ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

Rebase๋ž€?
๋ฉ”์ธ๋ธŒ๋žœ์น˜๊ฐ€ ์žˆ๊ณ , ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด ๋‘ ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ๊ฐ ์ถ”๊ฐ€์ ์ธ ์ปค๋ฐ‹์„ ํ•œ ๊ฒฝ์šฐ์—์„œ ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜์˜ ์‹œ์ž‘์ ์„ ๊ฐ•์ œ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.
์‰ฝ๊ฒŒ ๋งํ•˜์ž๋ฉด, ์„œ๋กœ ์ „ํ˜€ ์ƒ๊ด€์ด ์—†๋Š” ๋‘ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์—ˆ๊ณ , ๊ทธ ๊ธฐ๋Šฅ์ด ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„๋๋‹ค๋ฉด ๋‘˜์„ ํ•ฉ์น˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†๋‹ค. ์ด๋•Œ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด๋‚ธ ๋ธŒ๋žœ์น˜์˜ ์‹œ์ž‘์ ์„, ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ์ง€์ ์œผ๋กœ ๊ฐ•์ œ๋กœ ์˜ฎ๊ฒจ์„œ ํ•˜๋‚˜๋กœ ๋งŒ๋“œ๋Š”๋ฐ, ์ด๋ฅผ rebase๋ผ ํ•œ๋‹ค.

Fast-forward Merge๋ž€?
๋ฉ”์ธ๋ธŒ๋žœ์น˜๊ฐ€ ์žˆ๊ณ  ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ๋ฉ”์ธ๋ธŒ๋žœ์น˜๋Š” ์ƒˆ๋กœ์šด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์—†๊ณ  ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜๋งŒ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ๋Š” ์ƒํ™ฉ์—์„œ, ๋‹จ์ˆœํžˆ ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜๋ฅผ ๋ฉ”์ธ๋ธŒ๋žœ์น˜๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
(์˜†์œผ๋กœ ๋ป—์€ ํ•˜๋‚˜์˜ ๊ฐ€์ง€๋ฅผ ๋ฉ”์ธ์œผ๋กœ ์Šฅ ์˜ฎ๊ฒจ์˜ค๋Š” ๊ฒƒ์ด๋‹ค.)

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด