์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ—‚๏ธ ์ค‘์•™ ์ง‘์ค‘์‹ vs ๋ถ„์‚ฐํ˜• ๋ฒ„์ „ ๊ด€๋ฆฌ

๐Ÿ—‚๏ธ ์ค‘์•™ ์ง‘์ค‘์‹ vs ๋ถ„์‚ฐํ˜• ๋ฒ„์ „ ๊ด€๋ฆฌ

ํ˜‘์—… ํšจ์œจ์„ฑ์˜ ๋ชจ๋“  ๊ฒƒ โ€” ์ง„์งœ ๊ฐœ๋ฐœ์ž์ฒ˜๋Ÿผ ์ดํ•ดํ•˜๊ธฐ

๐Ÿ™Œ ์•ผ, ์ž ๊น๋งŒ! ๋„ˆ ํ˜น์‹œ ํŒ€ ํ”„๋กœ์ ํŠธ ํ•˜๋‹ค๊ฐ€ "์–ด? ๋‚ด ์ฝ”๋“œ ์–ด๋”” ๊ฐ”์ง€?" ํ˜น์€ "๋ˆ„๊ฐ€ ๋‚ด ํŒŒ์ผ ๋ฎ์–ด์ผ์–ด!!" ๋ผ๊ณ  ์™ธ์ณ๋ณธ ์  ์žˆ์–ด?
๊ทธ ๊ณ ํ†ต์˜ ๊ทผ์›์ด ๋ฐ”๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(VCS)์„ ์ œ๋Œ€๋กœ ์ดํ•ด ๋ชป ํ•ด์„œ์•ผ. ์˜ค๋Š˜์€ ๊ทธ ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ ๋ฐฉ์‹์ธ ์ค‘์•™ ์ง‘์ค‘์‹(Centralized)๊ณผ ๋ถ„์‚ฐํ˜•(Distributed)์„ ์™„์ „ํžˆ ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์•ผ. ์ปคํ”ผ ํ•œ ์ž” ๋“ค๊ณ  ํŽธํ•˜๊ฒŒ ์•‰์•„๋ด! โ˜•

๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ํ•œ๋ˆˆ์— ๋น„๊ต ๐Ÿ›๏ธ ์ค‘์•™ ์ง‘์ค‘์‹ (CVS/SVN) ์ค‘์•™ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์žA ๊ฐœ๋ฐœ์žB ๊ฐœ๋ฐœ์žC ๊ฐœ๋ฐœ์žD ๋ชจ๋“  ์ด๋ ฅ์ด ์„œ๋ฒ„์—๋งŒ ์กด์žฌ ์„œ๋ฒ„ ๋‹ค์šด = ์ž‘์—… ๋ถˆ๊ฐ€ โš ๏ธ ๐ŸŒ ๋ถ„์‚ฐํ˜• (Git) ์›๊ฒฉ ์ €์žฅ์†Œ ๊ฐœ๋ฐœ์žA ๋กœ์ปฌ์ €์žฅ์†Œ ๊ฐœ๋ฐœ์žB ๋กœ์ปฌ์ €์žฅ์†Œ ๊ฐœ๋ฐœ์žC ๋กœ์ปฌ์ €์žฅ์†Œ ๊ฐœ๋ฐœ์žD ๋กœ์ปฌ์ €์žฅ์†Œ ๊ฐ์ž ์ „์ฒด ์ด๋ ฅ ๋ณต์‚ฌ๋ณธ ๋ณด์œ  ์˜คํ”„๋ผ์ธ ์ž‘์—… ๊ฐ€๋Šฅ โœ…

๐Ÿ“š ๋ฒ„์ „ ๊ด€๋ฆฌ, ์™œ ํ•„์š”ํ•œ ๊ฑฐ์•ผ?

์†”์งํžˆ ๋งํ•ด๋ณผ๊ฒŒ. ๋ฒ„์ „ ๊ด€๋ฆฌ ์—†์ด ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•œ๋‹ค๋Š” ๊ฑด ๋งˆ์น˜ ๋ˆˆ ๊ฐ๊ณ  ๊ณ ์†๋„๋กœ ๋‹ฌ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„. ์ฒ˜์Œ์—” ๊ดœ์ฐฎ์•„ ๋ณด์—ฌ๋„, ๊ฒฐ๊ตญ ์‚ฌ๊ณ ๊ฐ€ ๋‚˜๊ฑฐ๋“ . ๐Ÿ˜…

๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(Version Control System, VCS)์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ์ถ”์ ํ•˜๊ณ , ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ๋™์‹œ์— ๊ฐ™์€ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์•ผ. ๋‹จ์ˆœํžˆ "์ €์žฅ" ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ, ์‹œ๊ฐ„์„ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž„๋จธ์‹  ๊ฐ™์€ ์กด์žฌ์ง€.

๐ŸŽฏ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ๋“ค
1
์ถฉ๋Œ(Conflict) ๊ด€๋ฆฌ โ€” ๋‘ ์‚ฌ๋žŒ์ด ๊ฐ™์€ ํŒŒ์ผ์„ ๋™์‹œ์— ์ˆ˜์ •ํ–ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ํ•ฉ์น ์ง€ ๊ฒฐ์ •ํ•ด์ค˜
2
์ด๋ ฅ ์ถ”์ (History Tracking) โ€” "์–ธ์ œ, ๋ˆ„๊ฐ€, ์™œ ์ด ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟจ๋Š”์ง€" ์™„๋ฒฝํ•˜๊ฒŒ ๊ธฐ๋กํ•ด
3
๋กค๋ฐฑ(Rollback) โ€” ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์–ด
4
๋ธŒ๋žœ์น˜(Branch) โ€” ๋ฉ”์ธ ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ƒˆ ๊ธฐ๋Šฅ์„ ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ์–ด
5
ํ˜‘์—… ์ง€์› โ€” ์ง€๊ตฌ ๋ฐ˜๋Œ€ํŽธ ํŒ€์›๊ณผ๋„ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•จ๊ป˜ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด

VCS๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ๋‚˜๋‰˜์–ด. ๋ฐ”๋กœ ์ค‘์•™ ์ง‘์ค‘์‹(Centralized VCS)๊ณผ ๋ถ„์‚ฐํ˜•(Distributed VCS)์ด์•ผ. ์ด ๋‘ ๋ฐฉ์‹์€ ์ฒ ํ•™ ์ž์ฒด๊ฐ€ ๋‹ฌ๋ผ์„œ, ์–ด๋–ค ๊ฑธ ์„ ํƒํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ํŒ€์˜ ํ˜‘์—… ๋ฐฉ์‹์ด ์™„์ „ํžˆ ๋‹ฌ๋ผ์ง€๊ฑฐ๋“ .

๐Ÿ›๏ธ ์ค‘์•™ ์ง‘์ค‘์‹ ๋ฒ„์ „ ๊ด€๋ฆฌ (CVCS)

์ค‘์•™ ์ง‘์ค‘์‹ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(Centralized Version Control System)์€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ํ•˜๋‚˜์˜ ์ค‘์•™ ์„œ๋ฒ„์— ๋ชจ๋“  ๋ฒ„์ „ ์ด๋ ฅ์ด ์ €์žฅ๋˜๋Š” ๋ฐฉ์‹์ด์•ผ. ๊ฐœ๋ฐœ์ž๋“ค์€ ์ด ์ค‘์•™ ์„œ๋ฒ„์—์„œ ํŒŒ์ผ์„ ์ฒดํฌ์•„์›ƒ(checkout)ํ•ด์„œ ์ž‘์—…ํ•˜๊ณ , ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ ์„œ๋ฒ„์— ์ปค๋ฐ‹(commit)ํ•ด.

๐Ÿ›๏ธ ๋Œ€ํ‘œ์ ์ธ CVCS ๋„๊ตฌ๋“ค CVS (Concurrent Versions System) SVN (Apache Subversion) Perforce ClearCase Team Foundation Server (TFS)

์ด ์ค‘์—์„œ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ๊ฑด SVN(Subversion)์ด์•ผ. 2000๋…„๋Œ€ ์ดˆ์ค‘๋ฐ˜์— ์—„์ฒญ๋‚œ ์ธ๊ธฐ๋ฅผ ๋Œ์—ˆ๊ณ , ์ง€๊ธˆ๋„ ์ผ๋ถ€ ๊ธฐ์—…์—์„œ๋Š” ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด. ํŠนํžˆ ๋Œ€ํ˜• ๊ธฐ์—…์˜ ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ์—์„œ ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ์ง€.

๐Ÿ” CVCS์˜ ์ž‘๋™ ์›๋ฆฌ

CVCS์˜ ์ž‘๋™ ๋ฐฉ์‹์€ ๊ฝค ์ง๊ด€์ ์ด์•ผ. ๋งˆ์น˜ ๋„์„œ๊ด€์—์„œ ์ฑ…์„ ๋นŒ๋ฆฌ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋ฉด ๋ผ:

์ฒดํฌ์•„์›ƒ(Checkout)
๊ฐœ๋ฐœ์ž๊ฐ€ ์ค‘์•™ ์„œ๋ฒ„์—์„œ ์ž‘์—…ํ•  ํŒŒ์ผ์„ ์ž์‹ ์˜ ๋กœ์ปฌ ์ปดํ“จํ„ฐ๋กœ ๋ณต์‚ฌํ•ด์™€. ์ด๋•Œ ์ตœ์‹  ๋ฒ„์ „์˜ ํŒŒ์ผ๋งŒ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒŒ ๊ธฐ๋ณธ์ด์•ผ.
์ˆ˜์ •(Modify)
๋กœ์ปฌ์—์„œ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด. ์ด ์‹œ์ ์—์„œ๋Š” ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ์ด ํ•„์š” ์—†์–ด.
์—…๋ฐ์ดํŠธ(Update)
์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ์„œ๋ฒ„์˜ ์ตœ์‹  ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋กœ์ปฌ์— ๋ฐ˜์˜ํ•ด. ๋‹ค๋ฅธ ํŒ€์›์ด ๋ณ€๊ฒฝํ•œ ๋‚ด์šฉ์„ ๋จผ์ € ๊ฐ€์ ธ์˜ค๋Š” ๊ฑฐ์•ผ.
์ถฉ๋Œ ํ•ด๊ฒฐ(Resolve Conflicts)
๊ฐ™์€ ํŒŒ์ผ์„ ์ˆ˜์ •ํ–ˆ๋‹ค๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ด. ์ด๊ฑธ ์ˆ˜๋™์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•ด.
์ปค๋ฐ‹(Commit)
์ˆ˜์ •๋œ ํŒŒ์ผ์„ ์ค‘์•™ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•ด. ์ด ์ˆœ๊ฐ„ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์„œ๋ฒ„์— ๊ธฐ๋ก๋ผ.
๐Ÿ’ก SVN์˜ ๋ฆฌ๋น„์ „ ๋ฒˆํ˜ธ SVN์—์„œ๋Š” ์ปค๋ฐ‹ํ•  ๋•Œ๋งˆ๋‹ค ์ „์ฒด ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ๋ฆฌ๋น„์ „ ๋ฒˆํ˜ธ(r1, r2, r3...)๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ด. ์ด ๋ฒˆํ˜ธ๋Š” ์ „์—ญ์ (global)์ด๋ผ์„œ, ์–ด๋–ค ํŒŒ์ผ์„ ์ˆ˜์ •ํ–ˆ๋“  ์ƒ๊ด€์—†์ด ์ €์žฅ์†Œ ์ „์ฒด์˜ ๋ฒ„์ „์ด ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฑฐ์•ผ. ์ด๊ฒŒ Git์˜ ํ•ด์‹œ(hash) ๋ฐฉ์‹๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅธ ์ ์ด์•ผ.

โœ… CVCS์˜ ์žฅ์ 

โœ… ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ โ€” ์ค‘์•™ ์„œ๋ฒ„ ํ•˜๋‚˜๋งŒ ๊ด€๋ฆฌํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ ์ธํ”„๋ผ ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์›Œ โœ… ๋ช…ํ™•ํ•œ ๊ถŒํ•œ ๊ด€๋ฆฌ โ€” ๋ˆ„๊ฐ€ ์–ด๋–ค ํŒŒ์ผ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ค‘์•™์—์„œ ํ†ต์ œ ๊ฐ€๋Šฅ โœ… ๋‚ฎ์€ ํ•™์Šต ๊ณก์„  โ€” ๊ฐœ๋…์ด ์ง๊ด€์ ์ด๋ผ ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ์‚ฌ๋žŒ๋„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•ด โœ… ๋Œ€์šฉ๋Ÿ‰ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ ์ฒ˜๋ฆฌ โ€” ๊ฒŒ์ž„ ์—์…‹, ๋””์ž์ธ ํŒŒ์ผ ๊ฐ™์€ ํฐ ํŒŒ์ผ ๊ด€๋ฆฌ์— ์œ ๋ฆฌ โœ… ๋ถ€๋ถ„ ์ฒดํฌ์•„์›ƒ โ€” ์ „์ฒด ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹Œ ํŠน์ • ํด๋”๋งŒ ์ฒดํฌ์•„์›ƒ ๊ฐ€๋Šฅ (SVN ํŠน์ง•) โœ… ๊ฐ์‚ฌ(Audit) ์šฉ์ด์„ฑ โ€” ์ค‘์•™ํ™”๋œ ์ด๋ ฅ์œผ๋กœ ๋ˆ„๊ฐ€ ๋ฌด์—‡์„ ํ–ˆ๋Š”์ง€ ์ถ”์ ํ•˜๊ธฐ ์‰ฌ์›Œ

โŒ CVCS์˜ ๋‹จ์ 

โŒ ๋‹จ์ผ ์žฅ์• ์ (SPOF) โ€” ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋˜๋ฉด ์•„๋ฌด๋„ ์ž‘์—… ๋ชป ํ•ด. ์น˜๋ช…์ ์ด์•ผ! โŒ ๋„คํŠธ์›Œํฌ ์˜์กด์„ฑ โ€” ์ธํ„ฐ๋„ท ์—†์ด๋Š” ์ปค๋ฐ‹, ์ด๋ ฅ ์กฐํšŒ ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์ด ๋ถˆ๊ฐ€๋Šฅํ•ด โŒ ๋А๋ฆฐ ์†๋„ โ€” ๋ชจ๋“  ์ž‘์—…์ด ์„œ๋ฒ„๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋‹ˆ๊นŒ ๋„คํŠธ์›Œํฌ ์†๋„์— ํฌ๊ฒŒ ์˜ํ–ฅ๋ฐ›์•„ โŒ ๋ธŒ๋žœ์นญ ๋น„์šฉ โ€” SVN์—์„œ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋ฌด๊ฒ๊ณ  ๋А๋ ค โŒ ๋ฐ์ดํ„ฐ ์†์‹ค ์œ„ํ—˜ โ€” ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์ƒ๋˜๋ฉด ์ „์ฒด ์ด๋ ฅ์ด ๋‚ ์•„๊ฐˆ ์ˆ˜ ์žˆ์–ด โŒ ์˜คํ”„๋ผ์ธ ์ž‘์—… ์ œํ•œ โ€” ๋น„ํ–‰๊ธฐ ์•ˆ์—์„œ ์ฝ”๋”ฉ? ์ปค๋ฐ‹์€ ๊ฟˆ๋„ ๋ชป ๊ฟ” โœˆ๏ธ
"SVN์„ ์“ฐ๋˜ ์‹œ์ ˆ, ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋์„ ๋•Œ ํŒ€ ์ „์ฒด๊ฐ€ ๋ฉํ•˜๋‹ˆ ์•‰์•„ ์žˆ๋˜ ๊ธฐ์–ต์ด ๋‚˜. ๊ทธ๋•Œ ์ฒ˜์Œ์œผ๋กœ '์ด๊ฒŒ ๋งž๋‚˜?' ์‹ถ์—ˆ์–ด." โ€” ์–ด๋А ์‹œ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž์˜ ํšŒ๊ณ 

๐ŸŒ ๋ถ„์‚ฐํ˜• ๋ฒ„์ „ ๊ด€๋ฆฌ (DVCS)

๋ถ„์‚ฐํ˜• ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(Distributed Version Control System)์€ CVCS์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ–ˆ์–ด. ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ๊ฐ„๋‹จํ•ด: ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ „์ฒด ์ €์žฅ์†Œ์˜ ์™„์ „ํ•œ ๋ณต์‚ฌ๋ณธ์„ ์ž์‹ ์˜ ๋กœ์ปฌ์— ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์•ผ.

์ด ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ํ˜๋ช…์„ ์ด๋ˆ ์ฃผ์ธ๊ณต์€ ๋ฐ”๋กœ Git์ด์•ผ. 2005๋…„ ๋ฆฌ๋ˆ„์Šค ํ† ๋ฅด๋ฐœ์ฆˆ(Linus Torvalds)๊ฐ€ ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ์ง€๊ธˆ์€ ์ „ ์„ธ๊ณ„ ๊ฐœ๋ฐœ์ž์˜ 90% ์ด์ƒ์ด ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€์ด ๋์–ด.

๐ŸŒ ๋Œ€ํ‘œ์ ์ธ DVCS ๋„๊ตฌ๋“ค Git Mercurial (Hg) Bazaar Darcs Fossil
Git ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ ์‹œ๊ฐํ™” main feature hotfix C1 ์ดˆ๊ธฐ ์ปค๋ฐ‹ C2 ๊ธฐ๋Šฅ ์ถ”๊ฐ€ C3 ๋ฒ„๊ทธ ์ˆ˜์ • F1 ์‹ ๊ธฐ๋Šฅ ์‹œ์ž‘ F2 UI ์ž‘์—… F3 ํ…Œ์ŠคํŠธ ์™„๋ฃŒ H1 ๊ธด๊ธ‰ ํŒจ์น˜ H2 ๊ฒ€์ฆ ์™„๋ฃŒ M1 feature ๋จธ์ง€ M2 hotfix ๋จธ์ง€ main ์ปค๋ฐ‹ feature ์ปค๋ฐ‹ hotfix ์ปค๋ฐ‹ ๋จธ์ง€ ์ปค๋ฐ‹

๐Ÿ” DVCS์˜ ์ž‘๋™ ์›๋ฆฌ

DVCS์—์„œ๋Š” ์ฒ˜์Œ ์ €์žฅ์†Œ๋ฅผ ํด๋ก (clone)ํ•  ๋•Œ ์ „์ฒด ์ด๋ ฅ์„ ํฌํ•จํ•œ ์™„์ „ํ•œ ๋ณต์‚ฌ๋ณธ์„ ๋กœ์ปฌ์— ๊ฐ€์ ธ์™€. ์ด๊ฒŒ ํ•ต์‹ฌ์ด์•ผ. ๊ทธ ์ดํ›„๋กœ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์„ ๋กœ์ปฌ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด.

ํด๋ก (Clone)
์›๊ฒฉ ์ €์žฅ์†Œ์˜ ์ „์ฒด ์ด๋ ฅ์„ ๋กœ์ปฌ๋กœ ๋ณต์‚ฌํ•ด. ์ด ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๋กœ์ปฌ์ด ์™„์ „ํ•œ ์ €์žฅ์†Œ๊ฐ€ ๋ผ.
๋กœ์ปฌ ์ž‘์—…(Local Work)
๋ธŒ๋žœ์น˜ ์ƒ์„ฑ, ์ปค๋ฐ‹, ์ด๋ ฅ ์กฐํšŒ ๋“ฑ ๋ชจ๋“  ์ž‘์—…์„ ์˜คํ”„๋ผ์ธ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์–ด. ๋„คํŠธ์›Œํฌ ๋ถˆํ•„์š”!
์Šคํ…Œ์ด์ง•(Staging)
Git์˜ ๋…ํŠนํ•œ ๊ฐœ๋…. ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์„ ๋ณ„์ ์œผ๋กœ ์Šคํ…Œ์ด์ง• ์˜์—ญ์— ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์–ด.
๋กœ์ปฌ ์ปค๋ฐ‹(Local Commit)
๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋กœ์ปฌ ์ €์žฅ์†Œ์— ์ปค๋ฐ‹ํ•ด. ์ด ์‹œ์ ์—์„œ๋Š” ์›๊ฒฉ ์„œ๋ฒ„์™€ ๋ฌด๊ด€ํ•ด.
ํ‘ธ์‹œ(Push) / ํ’€(Pull)
์ค€๋น„๊ฐ€ ๋์„ ๋•Œ ์›๊ฒฉ ์ €์žฅ์†Œ์™€ ๋™๊ธฐํ™”ํ•ด. Push๋Š” ๋‚ด ๋ณ€๊ฒฝ์‚ฌํ•ญ ์˜ฌ๋ฆฌ๊ธฐ, Pull์€ ๋‚จ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๊ฐ€์ ธ์˜ค๊ธฐ.
ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(Pull Request) / ๋จธ์ง€(Merge)
์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ›„ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ•ฉ์ณ. ํ˜‘์—…์˜ ํ•ต์‹ฌ ๋‹จ๊ณ„์•ผ!

โœ… DVCS์˜ ์žฅ์ 

โœ… ์˜คํ”„๋ผ์ธ ์ž‘์—… ์™„์ „ ์ง€์› โ€” ์ธํ„ฐ๋„ท ์—†์–ด๋„ ์ปค๋ฐ‹, ๋ธŒ๋žœ์น˜, ์ด๋ ฅ ์กฐํšŒ ๋‹ค ๋ผ! โœ… ๋น ๋ฅธ ์†๋„ โ€” ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์ด ๋กœ์ปฌ์—์„œ ์ด๋ฃจ์–ด์ง€๋‹ˆ๊นŒ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ์—†์Œ โœ… ๊ฐ•๋ ฅํ•œ ๋ธŒ๋žœ์นญ โ€” ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ์ด ๊ฑฐ์˜ ์ฆ‰๊ฐ์ ์ด๊ณ  ๋น„์šฉ์ด ๋งค์šฐ ๋‚ฎ์•„ โœ… ๋ถ„์‚ฐ๋œ ๋ฐฑ์—… โ€” ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ „์ฒด ์ด๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ์„œ๋ฒ„ ์žฅ์• ์—๋„ ์•ˆ์ „ โœ… ์œ ์—ฐํ•œ ์›Œํฌํ”Œ๋กœ์šฐ โ€” Gitflow, GitHub Flow ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜‘์—… ๋ฐฉ์‹ ์ง€์› โœ… ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฌธํ™” โ€” PR/MR ์‹œ์Šคํ…œ์œผ๋กœ ์ฒด๊ณ„์ ์ธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ฐ€๋Šฅ โœ… ์˜คํ”ˆ์†Œ์Šค ์ƒํƒœ๊ณ„ โ€” GitHub, GitLab, Bitbucket ๋“ฑ ํ’๋ถ€ํ•œ ํ”Œ๋žซํผ ์ง€์›

โŒ DVCS์˜ ๋‹จ์ 

โŒ ๋†’์€ ํ•™์Šต ๊ณก์„  โ€” Git์˜ ๊ฐœ๋…(staging, rebase, cherry-pick ๋“ฑ)์ด ์ฒ˜์Œ์—” ๋ณต์žกํ•ด โŒ ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์ฒ˜๋ฆฌ โ€” ํฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ๋งŽ์œผ๋ฉด ์ €์žฅ์†Œ๊ฐ€ ๋ฌด๊ฑฐ์›Œ์ ธ (Git LFS๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ) โŒ ์ดˆ๊ธฐ ํด๋ก  ์‹œ๊ฐ„ โ€” ์ด๋ ฅ์ด ๋งŽ์€ ๋Œ€ํ˜• ์ €์žฅ์†Œ๋Š” ์ฒ˜์Œ ํด๋ก ํ•  ๋•Œ ์˜ค๋ž˜ ๊ฑธ๋ ค โŒ ๋ณต์žกํ•œ ์ด๋ ฅ ๊ด€๋ฆฌ โ€” ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ ฅ์ด ์ง€์ €๋ถ„ํ•ด์งˆ ์ˆ˜ ์žˆ์–ด โŒ ๊ถŒํ•œ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ โ€” ํŒŒ์ผ ๋‹จ์œ„ ์„ธ๋ฐ€ํ•œ ๊ถŒํ•œ ์ œ์–ด๊ฐ€ CVCS๋ณด๋‹ค ์–ด๋ ค์›Œ

โš”๏ธ ํ•ต์‹ฌ ๋น„๊ต: CVCS vs DVCS

์ž, ์ด์ œ ๋‘ ๋ฐฉ์‹์„ ์ง์ ‘ ๋งž๋Œ€๊ฒฐ์‹œ์ผœ๋ณผ๊ฒŒ. ํ‘œ๋กœ ๋ณด๋ฉด ํ›จ์”ฌ ๋ช…ํ™•ํ•ด!

๋น„๊ต ํ•ญ๋ชฉ ์ค‘์•™ ์ง‘์ค‘์‹ (SVN) ๋ถ„์‚ฐํ˜• (Git)
์ €์žฅ์†Œ ์œ„์น˜ ์ค‘์•™ ์„œ๋ฒ„์—๋งŒ ์กด์žฌ ๋ชจ๋“  ๊ฐœ๋ฐœ์ž ๋กœ์ปฌ + ์›๊ฒฉ
์˜คํ”„๋ผ์ธ ์ž‘์—… ์ œํ•œ์  ์™„์ „ ์ง€์›
์†๋„ ๋„คํŠธ์›Œํฌ ์˜์กด ๋งค์šฐ ๋น ๋ฆ„
๋ธŒ๋žœ์นญ ๋น„์šฉ ์ƒ๋Œ€์ ์œผ๋กœ ๋ฌด๊ฑฐ์›€ ๊ฑฐ์˜ ์ฆ‰๊ฐ์ 
ํ•™์Šต ๋‚œ์ด๋„ ์‰ฌ์›€ ์ค‘๊ฐ„~์–ด๋ ค์›€
์„œ๋ฒ„ ์žฅ์•  ์˜ํ–ฅ ์ž‘์—… ์™„์ „ ์ค‘๋‹จ ๋กœ์ปฌ ์ž‘์—… ๊ณ„์† ๊ฐ€๋Šฅ
๋ฐ์ดํ„ฐ ์•ˆ์ „์„ฑ ์„œ๋ฒ„ ์˜์กด ๋ถ„์‚ฐ ๋ฐฑ์—…
๊ถŒํ•œ ๊ด€๋ฆฌ ์„ธ๋ฐ€ํ•œ ์ œ์–ด ์ €์žฅ์†Œ ๋‹จ์œ„
๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์ƒ๋Œ€์ ์œผ๋กœ ์œ ๋ฆฌ LFS ํ•„์š”
์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ œํ•œ์  PR/MR ์‹œ์Šคํ…œ
์˜คํ”ˆ์†Œ์Šค ์ƒํƒœ๊ณ„ ์ œํ•œ์  ๋งค์šฐ ํ’๋ถ€
ํ˜„์žฌ ์‹œ์žฅ ์ ์œ ์œจ ๊ฐ์†Œ ์ถ”์„ธ 90%+ ์ง€๋ฐฐ์ 
๐Ÿ›๏ธ CVCS๊ฐ€ ์—ฌ์ „ํžˆ ์œ ๋ฆฌํ•œ ์ƒํ™ฉ
๐Ÿ“ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ๋งŽ์€ ํ”„๋กœ์ ํŠธ ๐Ÿ”’ ํŒŒ์ผ ๋‹จ์œ„ ์„ธ๋ฐ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๐Ÿข ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ๊ณผ์˜ ํ†ตํ•ฉ์ด ํ•„์š”ํ•œ ๊ธฐ์—… ๐Ÿ‘ด ํŒ€์›๋“ค์˜ Git ํ•™์Šต์ด ์–ด๋ ค์šด ํ™˜๊ฒฝ ๐ŸŽฎ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ (์—์…‹ ๊ด€๋ฆฌ)
๐ŸŒ DVCS(Git)๊ฐ€ ์••๋„์ ์œผ๋กœ ์œ ๋ฆฌํ•œ ์ƒํ™ฉ
๐ŸŒ ๋ถ„์‚ฐ๋œ ํŒ€, ์›๊ฒฉ ๊ทผ๋ฌด ํ™˜๊ฒฝ ๐Ÿš€ ๋น ๋ฅธ ์ดํ„ฐ๋ ˆ์ด์…˜์ด ํ•„์š”ํ•œ ์Šคํƒ€ํŠธ์—… ๐Ÿ“– ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ โœˆ๏ธ ์ถœ์žฅ์ด ์žฆ๊ฑฐ๋‚˜ ์˜คํ”„๋ผ์ธ ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๐Ÿ”„ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•

๐Ÿค ํ˜‘์—… ํšจ์œจ์„ฑ: ์‹ค์ œ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ๋น„๊ต

์ด๋ก ์€ ์ถฉ๋ถ„ํžˆ ๋ดค์œผ๋‹ˆ๊นŒ, ์ด์ œ ์‹ค์ œ ํ˜‘์—… ์ƒํ™ฉ์—์„œ ๋‘ ๋ฐฉ์‹์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๊ตฌ์ฒด์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ์‚ดํŽด๋ณผ๊ฒŒ. ์ด๊ฒŒ ์ง„์งœ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด์•ผ!

๐Ÿ“Œ ์‹œ๋‚˜๋ฆฌ์˜ค 1: ๋™์‹œ ์ž‘์—…๊ณผ ์ถฉ๋Œ ํ•ด๊ฒฐ

๊ฐœ๋ฐœ์ž A์™€ B๊ฐ€ ๊ฐ™์€ ํŒŒ์ผ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ๋™์‹œ์— ์ˆ˜์ •ํ•˜๋Š” ์ƒํ™ฉ์ด์•ผ.

๐Ÿ›๏ธ SVN์—์„œ์˜ ์ƒํ™ฉ

A๊ฐ€ ๋จผ์ € ์ปค๋ฐ‹ํ•˜๋ฉด B๋Š” ์—…๋ฐ์ดํŠธ ํ›„ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•ด. ์ด ๊ณผ์ •์ด ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๋„คํŠธ์›Œํฌ๊ฐ€ ๋А๋ฆฌ๊ฑฐ๋‚˜ ์„œ๋ฒ„๊ฐ€ ๋ฐ”์˜๋ฉด ์ „์ฒด ํŒ€์˜ ์ž‘์—…์ด ๋А๋ ค์ ธ. ๋˜ํ•œ SVN์˜ ์ž ๊ธˆ(lock) ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ์‚ฌ๋žŒ์ด ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์€ ๊ทธ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์–ด. ์•ˆ์ „ํ•˜์ง€๋งŒ ๋ณ‘๋ ฌ ์ž‘์—…์ด ์ œํ•œ๋ผ.

๐ŸŒ Git์—์„œ์˜ ์ƒํ™ฉ

A์™€ B ๋ชจ๋‘ ์ž์‹ ์˜ ๋กœ์ปฌ ๋ธŒ๋žœ์น˜์—์„œ ์ž์œ ๋กญ๊ฒŒ ์ž‘์—…ํ•ด. ์„œ๋กœ์˜ ์ž‘์—…์— ์ „ํ˜€ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„. ๋‚˜์ค‘์— PR์„ ํ†ตํ•ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ›„ ๋จธ์ง€ํ•  ๋•Œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ๋•Œ ํ•ด๊ฒฐํ•ด. ์ถฉ๋Œ ํ•ด๊ฒฐ๋„ ๋กœ์ปฌ์—์„œ ์ด๋ฃจ์–ด์ง€๋‹ˆ๊นŒ ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ์—†์–ด. ๊ฒŒ๋‹ค๊ฐ€ Git์˜ 3-way merge ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ถฉ๋Œ ๊ฐ์ง€๊ฐ€ ๋งค์šฐ ์ •๊ตํ•ด.

๐Ÿ“Œ ์‹œ๋‚˜๋ฆฌ์˜ค 2: ๊ธด๊ธ‰ ๋ฒ„๊ทธ ์ˆ˜์ • (Hotfix)

ํ”„๋กœ๋•์…˜์— ์‹ฌ๊ฐํ•œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์–ด. ์ง€๊ธˆ ๋‹น์žฅ ๊ณ ์ณ์•ผ ํ•ด!

๐Ÿ›๏ธ SVN์—์„œ์˜ ์ƒํ™ฉ

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

๐ŸŒ Git์—์„œ์˜ ์ƒํ™ฉ

git stash๋กœ ํ˜„์žฌ ์ž‘์—…์„ ์ž„์‹œ ์ €์žฅํ•˜๊ณ , git checkout main์œผ๋กœ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋กœ ์ด๋™, git checkout -b hotfix/critical-bug๋กœ ํ•ซํ”ฝ์Šค ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ, ์ˆ˜์ • ํ›„ ์ปค๋ฐ‹, PR ์ƒ์„ฑ ๋ฐ ๋จธ์ง€. ์ „์ฒด ๊ณผ์ •์ด ๋งค์šฐ ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•ด. ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ์ด ๊ฑฐ์˜ ์ฆ‰๊ฐ์ ์ด๋ผ ๋ถ€๋‹ด์ด ์—†์–ด.

๐Ÿ“Œ ์‹œ๋‚˜๋ฆฌ์˜ค 3: ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค

ํŒ€์—์„œ ๋ชจ๋“  ์ฝ”๋“œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ฆฌ๋ทฐ๋ฅผ ์˜๋ฌดํ™”ํ–ˆ์–ด.

๐Ÿ›๏ธ SVN์—์„œ์˜ ์ƒํ™ฉ

SVN ์ž์ฒด์—๋Š” ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ์ด ์—†์–ด. ๋ณ„๋„์˜ ๋„๊ตฌ(Review Board, Crucible ๋“ฑ)๋ฅผ ์—ฐ๋™ํ•ด์•ผ ํ•˜๊ณ , ์ด ํ†ตํ•ฉ ๊ณผ์ •์ด ๋ณต์žกํ•  ์ˆ˜ ์žˆ์–ด. ๋ฆฌ๋ทฐ ์ „์— ์ด๋ฏธ ์„œ๋ฒ„์— ์ปค๋ฐ‹์ด ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์•„์„œ "์‚ฌํ›„ ๋ฆฌ๋ทฐ"๊ฐ€ ๋˜๊ธฐ ์‰ฌ์›Œ.

๐ŸŒ Git์—์„œ์˜ ์ƒํ™ฉ

GitHub/GitLab์˜ Pull Request(PR) / Merge Request(MR) ์‹œ์Šคํ…œ์ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋์–ด. ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ผ์ธ ๋‹จ์œ„๋กœ ์ฝ”๋ฉ˜ํŠธํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฆฌ๋ทฐ์–ด ์ง€์ •, ์Šน์ธ ์‹œ์Šคํ…œ, CI/CD ์—ฐ๋™๊นŒ์ง€ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•ด. ๋ฆฌ๋ทฐ๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋จธ์ง€๋˜์ง€ ์•Š์•„์„œ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ด€๋ฆฌ๊ฐ€ ํ›จ์”ฌ ์ฒด๊ณ„์ ์ด์•ผ.

๐Ÿ“Œ ์‹œ๋‚˜๋ฆฌ์˜ค 4: ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ

์œ ๋ช…ํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์–ด!

๐Ÿ›๏ธ SVN์—์„œ์˜ ์ƒํ™ฉ

์™ธ๋ถ€ ๊ธฐ์—ฌ์ž๊ฐ€ ์ง์ ‘ ์ €์žฅ์†Œ์— ์ปค๋ฐ‹ํ•˜๋ ค๋ฉด ๊ด€๋ฆฌ์ž๊ฐ€ ๊ณ„์ •๊ณผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด์•ผ ํ•ด. ์ด ๊ณผ์ •์ด ๋ฒˆ๊ฑฐ๋กญ๊ณ , ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์™ธ๋ถ€์ธ์—๊ฒŒ ์ €์žฅ์†Œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ฃผ๋Š” ๊ฒƒ๋„ ์œ„ํ—˜ํ•ด. ๋Œ€๊ทœ๋ชจ ์˜คํ”ˆ์†Œ์Šค ํ˜‘์—…์— ๊ตฌ์กฐ์ ์œผ๋กœ ๋ถˆ๋ฆฌํ•ด.

๐ŸŒ Git์—์„œ์˜ ์ƒํ™ฉ

Fork โ†’ Clone โ†’ Branch โ†’ Commit โ†’ Push โ†’ Pull Request. ์ด ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์™ธ๋ถ€ ๊ธฐ์—ฌ์ž๊ฐ€ ์›๋ณธ ์ €์žฅ์†Œ์— ์ง์ ‘ ์ ‘๊ทผ ๊ถŒํ•œ ์—†์ด๋„ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜. GitHub์˜ Fork ๋ชจ๋ธ์€ ์˜คํ”ˆ์†Œ์Šค ์ƒํƒœ๊ณ„๋ฅผ ํญ๋ฐœ์ ์œผ๋กœ ์„ฑ์žฅ์‹œํ‚จ ํ•ต์‹ฌ ์š”์ธ์ด์•ผ. ๋ฆฌ๋ˆ…์Šค ์ปค๋„, React, TensorFlow ๋“ฑ ๋ชจ๋“  ์ฃผ์š” ์˜คํ”ˆ์†Œ์Šค๊ฐ€ Git์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ์—ฌ๊ธฐ ์žˆ์–ด.

ํ˜‘์—… ํšจ์œจ์„ฑ ๋น„๊ต ๋ ˆ์ด๋” ์ฐจํŠธ ์˜คํ”„๋ผ์ธ ์ž‘์—… ์ž‘์—… ์†๋„ ๋ธŒ๋žœ์นญ ํšจ์œจ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ์ดํ„ฐ ์•ˆ์ „์„ฑ ํ•™์Šต ์šฉ์ด์„ฑ SVN (์ค‘์•™ ์ง‘์ค‘์‹) Git (๋ถ„์‚ฐํ˜•)

๐Ÿ”ง Git์˜ ํ•ต์‹ฌ ๊ฐœ๋… ์™„์ „ ์ •๋ณต

Git์ด ์™œ ์ด๋ ‡๊ฒŒ ๊ฐ•๋ ฅํ•œ์ง€ ์ดํ•ดํ•˜๋ ค๋ฉด ํ•ต์‹ฌ ๊ฐœ๋…๋“ค์„ ์ œ๋Œ€๋กœ ์•Œ์•„์•ผ ํ•ด. ์ฒ˜์Œ์—” ์ข€ ๋‚ฏ์„ค ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•œ ๋ฒˆ ์ดํ•ดํ•˜๋ฉด "์•„, ์ด๋ž˜์„œ Git์ด๊ตฌ๋‚˜!" ํ•˜๋Š” ์ˆœ๊ฐ„์ด ์™€.

๐ŸŒณ ๋ธŒ๋žœ์น˜(Branch) โ€” Git์˜ ํ•ต์‹ฌ ๋ฌด๊ธฐ

Git์—์„œ ๋ธŒ๋žœ์น˜๋Š” ํŠน์ • ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์•ผ. ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ทธ๋ƒฅ ํฌ์ธํ„ฐ๋งŒ ๋งŒ๋“œ๋Š” ๊ฑฐ๋ผ์„œ ๊ฑฐ์˜ ์ฆ‰๊ฐ์ ์œผ๋กœ ์ƒ์„ฑ๋ผ. ์ด๊ฒŒ SVN์˜ ๋ธŒ๋žœ์น˜(์‹ค์ œ๋กœ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ์‹)์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ฌ๋ผ.


# ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ๋ฐ ์ „ํ™˜ (๊ฑฐ์˜ ์ฆ‰๊ฐ์ !)
git checkout -b feature/new-login

# ๋˜๋Š” ์ตœ์‹  ๋ฐฉ์‹
git switch -c feature/new-login

# ๋ธŒ๋žœ์น˜ ๋ชฉ๋ก ํ™•์ธ
git branch -a

# ๋ธŒ๋žœ์น˜ ์‚ญ์ œ
git branch -d feature/new-login
๐Ÿ’ก Git ๋ธŒ๋žœ์น˜์˜ ๋น„๋ฐ€ Git์˜ ๋ธŒ๋žœ์น˜๋Š” ๋‹จ์ˆœํžˆ 40๋ฐ”์ดํŠธ์˜ SHA-1 ํ•ด์‹œ๋ฅผ ์ €์žฅํ•˜๋Š” ํŒŒ์ผ์ด์•ผ. ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ๊ฑด ์ด ์ž‘์€ ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ฟ์ด์•ผ. ๊ทธ๋ž˜์„œ ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด๋„ ์ €์žฅ์†Œ ํฌ๊ธฐ์— ๊ฑฐ์˜ ์˜ํ–ฅ์ด ์—†์–ด!

๐Ÿ“ฆ ์Šคํ…Œ์ด์ง• ์˜์—ญ(Staging Area) โ€” Git๋งŒ์˜ ๋…ํŠนํ•œ ๊ฐœ๋…

Git์—๋Š” ์›Œํ‚น ๋””๋ ‰ํ† ๋ฆฌ โ†’ ์Šคํ…Œ์ด์ง• ์˜์—ญ โ†’ ๋กœ์ปฌ ์ €์žฅ์†Œ์˜ 3๋‹จ๊ณ„ ๊ตฌ์กฐ๊ฐ€ ์žˆ์–ด. ์ด๊ฒŒ ์ฒ˜์Œ์—” ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ, ์‚ฌ์‹ค ์—„์ฒญ๋‚œ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ด.


# ํŠน์ • ํŒŒ์ผ๋งŒ ์Šคํ…Œ์ด์ง•
git add src/login.js

# ๋ณ€๊ฒฝ๋œ ๋ชจ๋“  ํŒŒ์ผ ์Šคํ…Œ์ด์ง•
git add .

# ํŒŒ์ผ์˜ ์ผ๋ถ€๋ถ„๋งŒ ์Šคํ…Œ์ด์ง• (๋Œ€ํ™”ํ˜•)
git add -p src/login.js

# ์Šคํ…Œ์ด์ง• ์ƒํƒœ ํ™•์ธ
git status

# ์ปค๋ฐ‹
git commit -m "feat: ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ฐœ์„ "

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

๐Ÿ”€ ๋จธ์ง€(Merge) vs ๋ฆฌ๋ฒ ์ด์Šค(Rebase)

๋ธŒ๋žœ์น˜๋ฅผ ํ•ฉ์น˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‘ ๊ฐ€์ง€์•ผ. ์ด ์„ ํƒ์ด ์ด๋ ฅ์˜ ๋ชจ์–‘์„ ๊ฒฐ์ •ํ•ด.

๐Ÿ”€ Merge

๋‘ ๋ธŒ๋žœ์น˜์˜ ์ด๋ ฅ์„ ๋ณด์กดํ•˜๋ฉด์„œ ํ•ฉ์ณ. ๋จธ์ง€ ์ปค๋ฐ‹์ด ์ƒ์„ฑ๋ผ์„œ "์–ธ์ œ ์–ด๋–ค ๋ธŒ๋žœ์น˜๊ฐ€ ํ•ฉ์ณ์กŒ๋Š”์ง€" ๋ช…ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์–ด. ์ด๋ ฅ์ด ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์‹ค ๊ทธ๋Œ€๋กœ์•ผ.

git merge feature/login
๐Ÿ“ Rebase

๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹๋“ค์„ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์˜ ๋์— ์žฌ์ ์šฉํ•ด. ์ด๋ ฅ์ด ์„ ํ˜•์œผ๋กœ ๊น”๋”ํ•ด์ง€์ง€๋งŒ, ๊ณต์œ ๋œ ๋ธŒ๋žœ์น˜์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์œ„ํ—˜ํ•ด. "์ด๋ ฅ ์žฌ์ž‘์„ฑ"์ด๋ผ ์ฃผ์˜ ํ•„์š”!

git rebase main

๐Ÿ’ Cherry-pick โ€” ์›ํ•˜๋Š” ์ปค๋ฐ‹๋งŒ ์™!

ํŠน์ • ๋ธŒ๋žœ์น˜์˜ ํŠน์ • ์ปค๋ฐ‹๋งŒ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜์—์„œ ๋ฒ„๊ทธ ์ˆ˜์ • ์ปค๋ฐ‹๋งŒ ํ”„๋กœ๋•์…˜ ๋ธŒ๋žœ์น˜์— ์ ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•ด.


# ํŠน์ • ์ปค๋ฐ‹์˜ ํ•ด์‹œ๋ฅผ ์ง€์ •ํ•ด์„œ ํ˜„์žฌ ๋ธŒ๋žœ์น˜์— ์ ์šฉ
git cherry-pick a1b2c3d4

# ์—ฌ๋Ÿฌ ์ปค๋ฐ‹ ์ ์šฉ
git cherry-pick a1b2c3d4 e5f6g7h8

๐Ÿš€ ํ˜„๋Œ€์  ํ˜‘์—… ์›Œํฌํ”Œ๋กœ์šฐ

Git์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํ˜„๋Œ€์ ์ธ ํ˜‘์—… ์›Œํฌํ”Œ๋กœ์šฐ๋“ค์„ ์•Œ์•„๋ณผ๊ฒŒ. ํŒ€์˜ ๊ทœ๋ชจ์™€ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ ํ•ฉํ•œ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ ธ.

๐ŸŒŠ Gitflow

Vincent Driessen์ด 2010๋…„์— ์ œ์•ˆํ•œ ๋ธŒ๋žœ์นญ ๋ชจ๋ธ์ด์•ผ. ๋ณต์žกํ•˜์ง€๋งŒ ์ฒด๊ณ„์ ์ธ ๋ฆด๋ฆฌ์ฆˆ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•ด.

Gitflow์˜ ๋ธŒ๋žœ์น˜ ๊ตฌ์กฐ
M
main โ€” ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ. ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์œ ์ง€
D
develop โ€” ๋‹ค์Œ ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์œ„ํ•œ ํ†ตํ•ฉ ๋ธŒ๋žœ์น˜
F
feature/* โ€” ์ƒˆ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ. develop์—์„œ ๋ถ„๊ธฐ, develop์œผ๋กœ ๋จธ์ง€
R
release/* โ€” ๋ฆด๋ฆฌ์ฆˆ ์ค€๋น„. develop์—์„œ ๋ถ„๊ธฐ, main๊ณผ develop์œผ๋กœ ๋จธ์ง€
H
hotfix/* โ€” ๊ธด๊ธ‰ ๋ฒ„๊ทธ ์ˆ˜์ •. main์—์„œ ๋ถ„๊ธฐ, main๊ณผ develop์œผ๋กœ ๋จธ์ง€

โšก GitHub Flow

GitHub์ด ์ œ์•ˆํ•œ ๋” ๋‹จ์ˆœํ•œ ์›Œํฌํ”Œ๋กœ์šฐ์•ผ. CI/CD์™€ ์ž˜ ๋งž๊ณ , ์ง€์†์  ๋ฐฐํฌ(Continuous Deployment)๋ฅผ ์‹ค์ฒœํ•˜๋Š” ํŒ€์— ์ ํ•ฉํ•ด.

GitHub Flow์˜ 6๋‹จ๊ณ„
1
main ๋ธŒ๋žœ์น˜์—์„œ ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ (์ด๋ฆ„์€ ์ž‘์—… ๋‚ด์šฉ์„ ๋ช…ํ™•ํžˆ)
2
๋ณ€๊ฒฝ์‚ฌํ•ญ ์ปค๋ฐ‹ (์ž‘๊ณ  ์ž์ฃผ ์ปค๋ฐ‹ํ•˜๋Š” ๊ฒŒ ์ข‹์•„)
3
Pull Request ์ƒ์„ฑ (์ž‘์—… ์ค‘์—๋„ ์—ด์–ด์„œ ํ”ผ๋“œ๋ฐฑ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด)
4
์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ ํ† ๋ก 
5
๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธ (PR ์ƒํƒœ์—์„œ ์Šคํ…Œ์ด์ง• ํ™˜๊ฒฝ์— ๋ฐฐํฌ ๊ฐ€๋Šฅ)
6
main์— ๋จธ์ง€ โ†’ ์ฆ‰์‹œ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ

๐ŸฆŠ GitLab Flow

GitLab์ด ์ œ์•ˆํ•œ ๋ฐฉ์‹์œผ๋กœ, GitHub Flow์™€ Gitflow์˜ ์ค‘๊ฐ„ ์ •๋„์•ผ. ํ™˜๊ฒฝ๋ณ„ ๋ธŒ๋žœ์น˜(staging, production)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•ด.

๐Ÿ’ก ์–ด๋–ค ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ? โ€ข ์†Œ๊ทœ๋ชจ ํŒ€ + ์ง€์†์  ๋ฐฐํฌ โ†’ GitHub Flow
โ€ข ์ •๊ธฐ์  ๋ฆด๋ฆฌ์ฆˆ + ๋ณต์žกํ•œ ๋ฒ„์ „ ๊ด€๋ฆฌ โ†’ Gitflow
โ€ข ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ(dev/staging/prod) ๊ด€๋ฆฌ โ†’ GitLab Flow
โ€ข ๋ชจ๋…ธ๋ ˆํฌ + ๋Œ€๊ทœ๋ชจ ํŒ€ โ†’ Trunk-Based Development

๐Ÿ“Š ์‹ค์ œ ์‚ฐ์—… ํ˜„ํ™ฉ๊ณผ ํ†ต๊ณ„

๋ง๋กœ๋งŒ "Git์ด ๋Œ€์„ธ์•ผ"๋ผ๊ณ  ํ•˜๋ฉด ๋ฏฟ๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ, ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค„๊ฒŒ.

๐Ÿ“ˆ Stack Overflow Developer Survey 2023 ๊ธฐ์ค€

์ „ ์„ธ๊ณ„ ๊ฐœ๋ฐœ์ž์˜ 93.87%๊ฐ€ Git์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์‘๋‹ตํ–ˆ์–ด. ์ด๊ฑด ๋‹จ์ˆœํžˆ "๋งŽ์ด ์“ด๋‹ค"๋Š” ์ˆ˜์ค€์ด ์•„๋‹ˆ๋ผ, ์‚ฌ์‹ค์ƒ ์—…๊ณ„ ํ‘œ์ค€์ด ๋๋‹ค๋Š” ์˜๋ฏธ์•ผ.

๋ฐ˜๋ฉด SVN์€ 5.1%, Mercurial์€ 1.1%์— ๋ถˆ๊ณผํ•ด. 10๋…„ ์ „๋งŒ ํ•ด๋„ SVN์ด ์ง€๋ฐฐ์ ์ด์—ˆ๋˜ ๊ฑธ ์ƒ๊ฐํ•˜๋ฉด ์—„์ฒญ๋‚œ ๋ณ€ํ™”์•ผ.

๐Ÿข ๊ธฐ์—…๋ณ„ ์ฑ„ํƒ ํ˜„ํ™ฉ

๊ธฐ์—…/ํ”Œ๋žซํผ ์‚ฌ์šฉ ์‹œ์Šคํ…œ ๊ทœ๋ชจ
Google ๋‚ด๋ถ€ ๋ชจ๋…ธ๋ ˆํฌ (Piper) + Git ์ˆ˜์‹ญ์–ต ์ค„์˜ ์ฝ”๋“œ
Microsoft Git (GVFS/VFSforGit) Windows ์ €์žฅ์†Œ 300GB+
Facebook/Meta Mercurial (์ปค์Šคํ…€ ํ™•์žฅ) ์ˆ˜์–ต ๊ฐœ์˜ ํŒŒ์ผ
Linux Kernel Git (ํƒ„์ƒ์ง€!) 2800๋งŒ+ ์ค„์˜ ์ฝ”๋“œ
GitHub Git 3์–ต+ ์ €์žฅ์†Œ

ํฅ๋ฏธ๋กœ์šด ์ ์€ Facebook/Meta๊ฐ€ Git ๋Œ€์‹  Mercurial์„ ์„ ํƒํ–ˆ๋‹ค๋Š” ๊ฑฐ์•ผ. ์ด์œ ๋Š” Mercurial์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๋” ๊น”๋”ํ•˜๊ณ  ํ™•์žฅํ•˜๊ธฐ ์‰ฌ์› ๊ธฐ ๋•Œ๋ฌธ์ด์•ผ. ํ•˜์ง€๋งŒ ์ด๊ฑด ๊ทนํžˆ ์˜ˆ์™ธ์ ์ธ ์ผ€์ด์Šค๊ณ , ์ผ๋ฐ˜์ ์ธ ํŒ€์—์„œ๋Š” Git์˜ ์ƒํƒœ๊ณ„๊ฐ€ ์••๋„์ ์œผ๋กœ ์œ ๋ฆฌํ•ด.

"Git์€ ๋‹จ์ˆœํ•œ ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ์•ผ. ํ˜„๋Œ€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ฌธํ™” ์ž์ฒด๋ฅผ ๋ฐ”๊ฟ”๋†“์€ ํ˜๋ช…์ด์•ผ. ์˜คํ”ˆ์†Œ์Šค์˜ ํญ๋ฐœ์  ์„ฑ์žฅ, ์›๊ฒฉ ๊ทผ๋ฌด์˜ ์ผ์ƒํ™”, CI/CD์˜ ๋ณดํŽธํ™” โ€” ์ด ๋ชจ๋“  ๊ฒŒ Git ์—†์ด๋Š” ๋ถˆ๊ฐ€๋Šฅํ–ˆ์„ ๊ฑฐ์•ผ."
Git ์ƒํƒœ๊ณ„ ์ „์ฒด ์ง€๋„ Git ํ•ต์‹ฌ ์—”์ง„ GitHub 3์–ต+ ์ €์žฅ์†Œ GitLab DevOps ํ”Œ๋žซํผ Bitbucket Atlassian Jenkins CI/CD GitHub Actions GitLab CI/CD SourceTree GUI ํด๋ผ์ด์–ธํŠธ VS Code Git ํ†ตํ•ฉ IntelliJ IDE ํ†ตํ•ฉ

๐ŸŽ“ Git ์‹ค์ „ ํŒ: ํ˜‘์—… ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ด๋ก ์€ ์ถฉ๋ถ„ํžˆ ์•Œ์•˜์œผ๋‹ˆ, ์‹ค์ œ๋กœ ํŒ€ ํ˜‘์—…์—์„œ Git์„ ์ž˜ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ๊ฒŒ. ์ด๊ฒŒ ์ง„์งœ ํ˜„์žฅ์—์„œ ์“ฐ์ด๋Š” ๋…ธํ•˜์šฐ์•ผ!

โœ๏ธ ์ข‹์€ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ๋ฒ•

์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” ๋ฏธ๋ž˜์˜ ๋‚˜์™€ ํŒ€์›์—๊ฒŒ ๋ณด๋‚ด๋Š” ํŽธ์ง€์•ผ. ์ž˜ ์“ฐ๋ฉด ๋‚˜์ค‘์— ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์–ด.


# ๋‚˜์œ ์˜ˆ โŒ
git commit -m "์ˆ˜์ •"
git commit -m "fix"
git commit -m "asdf"

# ์ข‹์€ ์˜ˆ โœ… (Conventional Commits ํ˜•์‹)
git commit -m "feat: ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์†Œ์…œ ์ธ์ฆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€"
git commit -m "fix: ๊ฒฐ์ œ ํŽ˜์ด์ง€ ๊ธˆ์•ก ๊ณ„์‚ฐ ์˜ค๋ฅ˜ ์ˆ˜์ • (#123)"
git commit -m "docs: API ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ"
git commit -m "refactor: ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด ์ฝ”๋“œ ์ •๋ฆฌ"
git commit -m "test: ๋กœ๊ทธ์ธ ์œ ๋‹› ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€"
git commit -m "chore: ์˜์กด์„ฑ ํŒจํ‚ค์ง€ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ"
๐Ÿ’ก Conventional Commits ํƒ€์ž… ์ •๋ฆฌ โ€ข feat: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ
โ€ข fix: ๋ฒ„๊ทธ ์ˆ˜์ •
โ€ข docs: ๋ฌธ์„œ ๋ณ€๊ฒฝ
โ€ข style: ์ฝ”๋“œ ํฌ๋งทํŒ… (๊ธฐ๋Šฅ ๋ณ€๊ฒฝ ์—†์Œ)
โ€ข refactor: ๋ฆฌํŒฉํ† ๋ง
โ€ข test: ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€/์ˆ˜์ •
โ€ข chore: ๋นŒ๋“œ ์„ค์ •, ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋“ฑ
โ€ข perf: ์„ฑ๋Šฅ ๊ฐœ์„ 
โ€ข ci: CI ์„ค์ • ๋ณ€๊ฒฝ

๐Ÿ›ก๏ธ .gitignore ์ œ๋Œ€๋กœ ์„ค์ •ํ•˜๊ธฐ

๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” ์—†๋Š” ํŒŒ์ผ๋“ค์„ ๋ช…ํ™•ํžˆ ์ œ์™ธํ•ด์•ผ ํ•ด. ์ด๊ฑธ ์•ˆ ํ•˜๋ฉด ์ €์žฅ์†Œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด์ง€๊ณ  ๋ณด์•ˆ ๋ฌธ์ œ๋„ ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด.


# .gitignore ์˜ˆ์‹œ (Node.js ํ”„๋กœ์ ํŠธ)
node_modules/
.env
.env.local
.env.production
dist/
build/
*.log
.DS_Store
.idea/
.vscode/settings.json
coverage/

๐Ÿ” ์œ ์šฉํ•œ Git ๋ช…๋ น์–ด ๋ชจ์Œ


# ์ด๋ ฅ ์˜ˆ์˜๊ฒŒ ๋ณด๊ธฐ
git log --oneline --graph --all --decorate

# ํŠน์ • ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ ์ด๋ ฅ
git log -p src/login.js

# ํŠน์ • ์ฝ”๋“œ๊ฐ€ ์–ธ์ œ ์ถ”๊ฐ€๋๋Š”์ง€ ์ฐพ๊ธฐ
git log -S "findUserById" --source --all

# ๋ˆ„๊ฐ€ ์ด ์ค„์„ ์ž‘์„ฑํ–ˆ๋Š”์ง€ (blame)
git blame src/login.js

# ๋ฒ„๊ทธ๊ฐ€ ์–ธ์ œ ์ƒ๊ฒผ๋Š”์ง€ ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ ์ฐพ๊ธฐ
git bisect start
git bisect bad HEAD
git bisect good v1.0.0

# ์ž„์‹œ ์ €์žฅ
git stash push -m "๋กœ๊ทธ์ธ ์ž‘์—… ์ค‘"
git stash list
git stash pop

# ์ปค๋ฐ‹ ๋˜๋Œ๋ฆฌ๊ธฐ (์ด๋ ฅ ๋ณด์กด)
git revert HEAD

# ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ์ˆ˜์ •
git commit --amend

# ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฆฌ๋ฒ ์ด์Šค (์ด๋ ฅ ์ •๋ฆฌ)
git rebase -i HEAD~3

๐Ÿ”’ ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™ ์„ค์ •

GitHub/GitLab์—์„œ main ๋ธŒ๋žœ์น˜๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๊ฑด ํŒ€ ํ˜‘์—…์˜ ๊ธฐ๋ณธ์ด์•ผ:

๐Ÿ”’ ์ง์ ‘ ํ‘ธ์‹œ ๊ธˆ์ง€ โ€” main ๋ธŒ๋žœ์น˜์— ์ง์ ‘ push ๋ถˆ๊ฐ€, PR ํ•„์ˆ˜ ๐Ÿ‘ฅ ๋ฆฌ๋ทฐ์–ด ์Šน์ธ ํ•„์ˆ˜ โ€” ์ตœ์†Œ 1~2๋ช…์˜ ์Šน์ธ ์—†์ด ๋จธ์ง€ ๋ถˆ๊ฐ€ โœ… CI ํ†ต๊ณผ ํ•„์ˆ˜ โ€” ํ…Œ์ŠคํŠธ, ๋ฆฐํŠธ ๋“ฑ ์ž๋™ํ™” ๊ฒ€์‚ฌ ํ†ต๊ณผ ํ›„ ๋จธ์ง€ ๐Ÿ”„ ์ตœ์‹  ์ƒํƒœ ์œ ์ง€ โ€” ๋จธ์ง€ ์ „ main์˜ ์ตœ์‹  ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฐ˜์˜ ํ•„์ˆ˜ ๐Ÿ—‘๏ธ ๋จธ์ง€ ํ›„ ๋ธŒ๋žœ์น˜ ์ž๋™ ์‚ญ์ œ โ€” ์ €์žฅ์†Œ ์ •๋ฆฌ

๐ŸŒŸ ๋ฏธ๋ž˜ ์ „๋ง: ๋ฒ„์ „ ๊ด€๋ฆฌ์˜ ๋‹ค์Œ ๋‹จ๊ณ„

๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ๋„ ๊ณ„์† ์ง„ํ™”ํ•˜๊ณ  ์žˆ์–ด. ์•ž์œผ๋กœ ์–ด๋–ค ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐœ์ „ํ• ์ง€ ์‚ดํŽด๋ณผ๊ฒŒ.

๐Ÿค– AI ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ

GitHub Copilot, GitLab Duo ๊ฐ™์€ AI ๋„๊ตฌ๋“ค์ด PR ๋ฆฌ๋ทฐ์— ์ ๊ทน ํ™œ์šฉ๋˜๊ณ  ์žˆ์–ด. AI๊ฐ€ ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ, ๋ณด์•ˆ ์ทจ์•ฝ์ , ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ์ œ์•ˆํ•ด์ค˜. ์ด๋ฏธ ๋งŽ์€ ํŒ€์—์„œ AI ๋ฆฌ๋ทฐ๋ฅผ 1์ฐจ ํ•„ํ„ฐ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด.

๐ŸŒ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

GitHub Codespaces, GitLab Web IDE, Gitpod ๊ฐ™์€ ๋„๊ตฌ๋“ค์ด "๋กœ์ปฌ ํ™˜๊ฒฝ ์„ค์ •" ์ž์ฒด๋ฅผ ์—†์• ๊ณ  ์žˆ์–ด. ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ”๋กœ ์ฝ”๋”ฉํ•˜๊ณ , ์ €์žฅ์†Œ์™€ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ด. ์ด๊ฑด DVCS์˜ "๋กœ์ปฌ ์ €์žฅ์†Œ" ๊ฐœ๋…์„ ํด๋ผ์šฐ๋“œ๋กœ ํ™•์žฅํ•œ ๊ฑฐ์•ผ.

๐Ÿ“ฆ ๋ชจ๋…ธ๋ ˆํฌ(Monorepo) ํŠธ๋ Œ๋“œ

Google, Meta, Microsoft ๊ฐ™์€ ๋Œ€๊ธฐ์—…๋“ค์ด ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ์ €์žฅ์†Œ์— ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋…ธ๋ ˆํฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด. Nx, Turborepo, Bazel ๊ฐ™์€ ๋„๊ตฌ๋“ค์ด ์ด๋ฅผ ์ง€์›ํ•˜๊ณ  ์žˆ์–ด. Git์˜ ์„ฑ๋Šฅ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ๊ธฐ์ˆ (sparse checkout, partial clone ๋“ฑ)๋„ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์–ด.

๐Ÿ”— ๋ธ”๋ก์ฒด์ธ ๊ธฐ๋ฐ˜ ๋ฒ„์ „ ๊ด€๋ฆฌ?

Radicle ๊ฐ™์€ ํ”„๋กœ์ ํŠธ๋Š” ํƒˆ์ค‘์•™ํ™”๋œ Git ํ˜‘์—… ํ”Œ๋žซํผ์„ ๋งŒ๋“ค๊ณ  ์žˆ์–ด. GitHub ๊ฐ™์€ ์ค‘์•™ํ™”๋œ ํ”Œ๋žซํผ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , P2P ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฑฐ์•ผ. ์•„์ง ์ดˆ๊ธฐ ๋‹จ๊ณ„์ง€๋งŒ, ๊ฒ€์—ด ์ €ํ•ญ์„ฑ๊ณผ ๋ฐ์ดํ„ฐ ์ฃผ๊ถŒ ์ธก๋ฉด์—์„œ ํฅ๋ฏธ๋กœ์šด ์‹œ๋„์•ผ.

๐Ÿ’ก ์žฌ๋Šฅ๋„ท์—์„œ๋„ Git ๊ด€๋ จ ์žฌ๋Šฅ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด! ์žฌ๋Šฅ๋„ท์—์„œ๋Š” Git/GitHub ์‚ฌ์šฉ๋ฒ• ๊ฐ•์˜, ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์„œ๋น„์Šค, CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ๋“ฑ ๋‹ค์–‘ํ•œ ๊ฐœ๋ฐœ ๊ด€๋ จ ์žฌ๋Šฅ๋“ค์ด ๊ฑฐ๋ž˜๋˜๊ณ  ์žˆ์–ด. ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ํŒ€์ด๋ผ๋ฉด ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ!

๐ŸŽฏ ์–ด๋–ค ๊ฑธ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ? ์ตœ์ข… ๊ฐ€์ด๋“œ

์ž, ์ด์ œ ๋ชจ๋“  ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด์„œ "๋‚˜๋Š” ์–ด๋–ค ๊ฑธ ์จ์•ผ ํ•˜๋‚˜?"์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๋‹ต์„ ์ค„๊ฒŒ.

๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ์„ ํƒ ๊ฐ€์ด๋“œ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋‚˜์š”? ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ์„ ํƒ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ๋งŽ์€๊ฐ€์š”? (๊ฒŒ์ž„ ์—์…‹, ๋””์ž์ธ ํŒŒ์ผ ๋“ฑ) YES NO SVN ๊ณ ๋ ค + Git LFS๋„ ๋Œ€์•ˆ Perforce๋„ ๊ฒ€ํ†  ํŒ€์ด ๋ถ„์‚ฐ๋˜์–ด ์žˆ๋‚˜์š”? (์›๊ฒฉ ๊ทผ๋ฌด, ๋‹ค๋ฅธ ์‹œ๊ฐ„๋Œ€) ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€์š”? (์™ธ๋ถ€ ๊ธฐ์—ฌ์ž ํ—ˆ์šฉ) ๐ŸŒŸ Git ๊ฐ•๋ ฅ ์ถ”์ฒœ! GitHub / GitLab / Bitbucket ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์„ธ์š” ๋ ˆ๊ฑฐ์‹œ ๊ณ ๋ ค ๊ธฐ์กด SVN ์œ ์ง€ ๋˜๋Š” ์ ์ง„์  Git ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ Git ์ถ”์ฒœ ๊ฒฝ๋กœ SVN/๋ ˆ๊ฑฐ์‹œ ๊ณ ๋ ค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒ€ํ† 
๐ŸŽฏ ๊ฒฐ๋ก : 2024๋…„ ๊ธฐ์ค€ ๊ถŒ์žฅ ์‚ฌํ•ญ
โœ“
์‹ ๊ทœ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ๋ฌด์กฐ๊ฑด Git โ€” ์ƒํƒœ๊ณ„, ๋„๊ตฌ, ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ชจ๋“  ๋ฉด์—์„œ ์••๋„์ ์ด์•ผ
โœ“
๊ธฐ์กด SVN ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณ ๋ ค โ€” git-svn ๋„๊ตฌ๋กœ ์ด์ „ ๊ฐ€๋Šฅํ•ด
โœ“
๋Œ€์šฉ๋Ÿ‰ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋งŽ๋‹ค๋ฉด Git LFS ํ™œ์šฉ โ€” Git์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ์–ด
โœ“
ํ”Œ๋žซํผ์€ ํŒ€ ์ƒํ™ฉ์— ๋งž๊ฒŒ โ€” GitHub(์˜คํ”ˆ์†Œ์Šค/์Šคํƒ€ํŠธ์—…), GitLab(์ž์ฒด ํ˜ธ์ŠคํŒ…/๊ธฐ์—…), Bitbucket(Jira ์—ฐ๋™)

๐Ÿ”„ SVN์—์„œ Git์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ

์ด๋ฏธ SVN์„ ์“ฐ๊ณ  ์žˆ๋Š”๋ฐ Git์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  ์‹ถ๋‹ค๋ฉด? ๊ฑฑ์ • ๋งˆ, ๋ฐฉ๋ฒ•์ด ์žˆ์–ด!

๐Ÿ› ๏ธ git-svn์„ ์ด์šฉํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜


# SVN ์ €์žฅ์†Œ๋ฅผ Git์œผ๋กœ ํด๋ก  (์ „์ฒด ์ด๋ ฅ ํฌํ•จ)
git svn clone https://svn.example.com/project \
  --authors-file=authors.txt \
  --no-metadata \
  -s \
  git-project

# authors.txt ํ˜•์‹ (SVN ์‚ฌ์šฉ์ž โ†’ Git ์‚ฌ์šฉ์ž ๋งคํ•‘)
# svnuser = Git User <gituser@example.com>

# ๋ธŒ๋žœ์น˜์™€ ํƒœ๊ทธ ์ •๋ฆฌ
cd git-project
git for-each-ref refs/remotes/tags | \
  cut -d / -f 4- | \
  grep -v @ | \
  while read tagname; do
    git tag "$tagname" "refs/remotes/tags/$tagname"
    git branch -r -d "tags/$tagname"
  done

# ์›๊ฒฉ ์ €์žฅ์†Œ์— ํ‘ธ์‹œ
git remote add origin https://github.com/yourorg/project.git
git push origin --all
git push origin --tags
๐Ÿ’ก ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ ์ฃผ์˜์‚ฌํ•ญ โ€ข SVN์˜ ๋ฆฌ๋น„์ „ ๋ฒˆํ˜ธ๋Š” Git์˜ ์ปค๋ฐ‹ ํ•ด์‹œ๋กœ ๋ณ€ํ™˜๋ผ
โ€ข ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ๋งŽ๋‹ค๋ฉด Git LFS ์„ค์ •์„ ๋จผ์ € ํ•ด
โ€ข ํŒ€์›๋“ค์—๊ฒŒ Git ๊ต์œก์„ ๋จผ์ € ์ง„ํ–‰ํ•˜๊ณ  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด
โ€ข ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ›„ ์ผ์ • ๊ธฐ๊ฐ„ SVN๊ณผ ๋ณ‘ํ–‰ ์šด์˜ํ•˜๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด์•ผ
โ€ข ์žฌ๋Šฅ๋„ท(jaenung.net)์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋ฌธ๊ฐ€๋ฅผ ์ฐพ์•„๋ณผ ์ˆ˜๋„ ์žˆ์–ด!

๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ: ๋ฒ„์ „ ๊ด€๋ฆฌ๋Š” ํŒ€ ๋ฌธํ™”๋‹ค

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ์ค‘์•™ ์ง‘์ค‘์‹๊ณผ ๋ถ„์‚ฐํ˜• ๋ฒ„์ „ ๊ด€๋ฆฌ์˜ ๋ชจ๋“  ๊ฒƒ์„ ์‚ดํŽด๋ดค์–ด. ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๊ณ  ์‹ถ์–ด.

๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์€ ๋‹จ์ˆœํ•œ ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ์•ผ. ๊ทธ๊ฒƒ์€ ํŒ€์ด ์–ด๋–ป๊ฒŒ ํ˜‘์—…ํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋Œ€ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ฌธํ™”๋ฅผ ๋ฐ˜์˜ํ•ด. Git์„ ๋„์ž…ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ž๋™์œผ๋กœ ํ˜‘์—…์ด ์ข‹์•„์ง€๋Š” ๊ฒŒ ์•„๋‹ˆ์•ผ. ์ข‹์€ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ, ์ฒด๊ณ„์ ์ธ ๋ธŒ๋žœ์น˜ ์ „๋žต, ์„ฑ์‹คํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ โ€” ์ด๋Ÿฐ ์Šต๊ด€๋“ค์ด ์Œ“์—ฌ์•ผ ์ง„์ •ํ•œ ํ˜‘์—… ํšจ์œจ์„ฑ์ด ๋‚˜์™€.

๐ŸŒŸ ํ•ต์‹ฌ ์š”์•ฝ
1
CVCS(SVN)๋Š” ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ ์ด์ง€๋งŒ, ์„œ๋ฒ„ ์˜์กด์„ฑ๊ณผ ์˜คํ”„๋ผ์ธ ์ œํ•œ์ด ์น˜๋ช…์  ์•ฝ์ ์ด์•ผ
2
DVCS(Git)๋Š” ํ•™์Šต ๊ณก์„ ์ด ์žˆ์ง€๋งŒ, ํ˜„๋Œ€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์˜ ์‚ฌ์‹ค์ƒ ํ‘œ์ค€์ด์•ผ
3
ํ˜‘์—… ํšจ์œจ์„ฑ์€ ๋„๊ตฌ ์„ ํƒ๋งŒํผ์ด๋‚˜ ํŒ€์˜ ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๋ฌธํ™”์— ๋‹ฌ๋ ค ์žˆ์–ด
4
Git ์ƒํƒœ๊ณ„(GitHub/GitLab + CI/CD + ์ฝ”๋“œ ๋ฆฌ๋ทฐ)๋Š” ํ˜„๋Œ€ DevOps์˜ ํ•ต์‹ฌ์ด์•ผ
5
์ง€๊ธˆ ๋‹น์žฅ Git์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ๊ฐœ๋ฐœ์ž๋กœ์„œ ๊ฐ€์žฅ ๊ฐ€์„ฑ๋น„ ๋†’์€ ํˆฌ์ž์•ผ
"The best version control system is the one your team actually uses correctly." โ€” ์–ด๋А ํ˜„๋ช…ํ•œ ๊ฐœ๋ฐœ์ž์˜ ๋ง
(์ตœ๊ณ ์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์€ ํŒ€์ด ์‹ค์ œ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.)

๋ฒ„์ „ ๊ด€๋ฆฌ๋Š” ์ •๋ณด ์ง€๋Šฅ๊ณตํ•™์˜ ํ•ต์‹ฌ ์ธํ”„๋ผ์•ผ. ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ์ถ”์ ํ•˜๊ณ , ์ง€์‹์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ํ˜‘์—…์„ ํ†ตํ•ด ๋” ๋‚˜์€ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ โ€” ์ด๊ฒŒ ๋ฐ”๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด ์ถ”๊ตฌํ•˜๋Š” ๊ฐ€์น˜์•ผ. ๐Ÿš€

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.