๐ก
์ฐ๋ฆฌ๋ ํ์ ์์ค์ฝ๋๋ ๋ฌธ์๋ฅผ ๋ค๋ฃฐ ๋, ๋๋ฌด ๋ง์ ๋ณต์ฌ๋ณธ์ด ์๋ค๊ฑฐ๋, ์์ ๋ณธ์์ ์๋ณธ์ผ๋ก ๋๋๋ฆฌ๊ณ ์ถ์๋ฐ ์ด๋ ต๋ค๊ฑฐ๋ ํ๋ ์ํฉ์ ๋ฌธ์ ๋ฅผ ์ข
์ข
๋ง์ฃผํ๋ค. ์ด๋ด ๋์๋ '๋ฒ์ ๊ด๋ฆฌ'๋ฅผ ํตํด ๋ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. ์ง๊ธ๋ถํฐ ์์๋ณผ Git๋ '๋ฒ์ ๊ด๋ฆฌ ์์คํ
'์ ์ํ๋ ํ๋ก๊ทธ๋จ ์ค ํ๋์ด๋ค. ์ฐ์ '๋ฒ์ ๊ด๋ฆฌ'์ '๋ฒ์ ๊ด๋ฆฌ ์์คํ
'์ด ๋ฌด์์ธ์ง ์์๋ณด๊ณ , Git๊ณผ Git Workflow์ ๊ดํด์ ํํค์ณ ๋ณด์.
: ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ฐ ์ ์ง ๋ณด์ ๊ณผ์ ์์ ๋ฐ์ํ๋ ์์ค ์ฝ๋, ๋ฌธ์ ๋ฑ์ ์์ฑ, ๋ณ๊ฒฝ ์ด๋ ฅ, ์ญ์ ์ด๋ ฅ ๋ฑ์ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๋ ๋ค์์ ์ํฉ์์ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ํ์ํจ์ ์ธ์งํ๋ค.
: ํ์ผ ๋ณํ๋ฅผ ์๊ฐ์ ๋ฐ๋ผ ๊ธฐ๋กํ๋ค๊ฐ ๋์ค์ ํน์ ์์ ์ ๋ฒ์ ์ ๋ค์ ๋ถ๋ฌ์ฌ ์ ์๋ ์์คํ ์ด๋ค. ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ ํฌ๊ฒ 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์ ์ฐ๋ฆฌ์๊ฒ ๋ฆฌ๋ ์ค๋ก ์ ๋ช ํ ๋ฆฌ๋์ค ํ ๋ฅด๋ฐ์ฆ๊ฐ 2005๋ ์ ๊ฐ๋ฐํ ๋ถ์ฐ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ผ๋ก, ์ปดํจํฐ ํ์ผ์ ๋ณ๊ฒฝ์ฌํญ์ ์ถ์ ํ๊ณ ์ฌ๋ฌ ๋ช ์ ์ฌ์ฉ์๋ค ๊ฐ์ ํ์ผ์ ๋ํ ์์ ์ ์กฐ์จํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์ฆ, ์ฃผ๋ก ์ฌ๋ฌ ๋ช ์ ๊ฐ๋ฐ์๊ฐ ํ๋์ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๋ก์ ํธ์ ์ฐธ์ฌํ ๋, ์์ค ์ฝ๋๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
// ๋ก์ปฌ ์ ์ฅ์์ ์๋ก์ด ๋ฒ์ ์ ํ์ผ์ ์ ์ฅํ๋ commit, ๋ก์ปฌ ์ปดํจํฐ์์ ์๋ฒ๋ก ๋ณ๊ฒฝ ์ฌํญ์ ๋ณด๋ด๋ push๋ ๋ค๋ฅธ ๊ฐ๋ ์ด๋ค. commit๊ณผ push๋ฅผ ํผ๋ํ์ง ์๋๋ก ์ ์ํ์.
Git์ ๋ธ๋์น๋ก ์์ ์ ๊ด๋ฆฌํ๋๋ฐ, ํ์์ ๋ธ๋์น๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง์ ๋ํด ์ ํด๋ ๊ท์น์ Workflow๋ผ๊ณ ํ๋ค. Git์ ์ฌ์ฉํ ๊ฐ์ฅ ๋ํ์ ์ธ Workflow๋ Git flow, Github flow, Gitlab flow๊ฐ ์๋ค.
๋ธ๋์น์ ์ญํ ์ด ๋ช
ํํ๊ณ ๋๊ท๋ชจ ํ๋ก์ ํธ์ ์ ํฉํ workflow์ด๋ค. 5๊ฐ์ ๋ธ๋์น๋ก ๊ด๋ฆฌํ๋ฉฐ 2๊ฐ์ ๋ฉ์ธ ๋ธ๋์น์ธ master, develop๊ณผ 3๊ฐ์ ๋ณด์กฐ ๋ธ๋์น์ธ feature, release, hotfix๋ก ๋๋๋ค.
โ Git flow์ ์์ ๊ณผ์
1. ๊ฐ์ธ ์์ ์ develop์์ feature ๋ธ๋์น๋ฅผ ๋ฐ์ ์์ ํ๋ค. ๊ฐ์ธ ์์ ์ด ๋๋๋ฉด develop์ ๋ณํฉํ๋ค.
2. develop ๋ธ๋์น์์ ๋ฐฐํฌ ์ค๋น๊ฐ ๋๋๋ฉด release ๋ธ๋์น๋ก ๋ถํ ํ๋ค.
3. release ๋ธ๋์น์์ ๋๋ฒ๊น ํ๊ณ ๋ฌธ์ ๊ฐ ์์ผ๋ฉด master์ develop ๋ธ๋์น์ ํฉ์น๋ค.
4. master ๋ธ๋์น๋ฅผ ๋ฐฐํฌํ๋ค.
5. ๋ง์ฝ ๋ฐฐํฌ ๋ฒ์ ์์ ๋ฌธ์ ๊ฐ ์๊ฒจ ๊ธํ๊ฒ ์์ ํด์ผ ํ๋ฉด hotfix ๋ธ๋์น๋ฅผ ๋ฐ์ ์์ ํ๋ค.
6. hotfix์์ ๋ฒ๊ทธ ํฝ์ค๊ฐ ๋๋๋ฉด master์ develop์ ํฉ์น๋ค.
ํ๋์ ๋ฉ์ธ ๋ธ๋์น์ธ master ๋ธ๋์น๋ฅผ ์ค์ ์ผ๋ก ์ด์ฉํ๋ฉฐ pull request๋ฅผ ํ์ฉํ๋ ๋ฐฉ์์ workflow์ด๋ค.
(+ pull request๋ "์์
ํ ์ฝ๋๊ฐ ์์ผ๋ ๋ด ๋ธ๋์น๋ฅผ pullํด ๊ฒํ , ๋ณํฉํด๋ฌ๋ผ"๋ผ๋ ์๋ฏธ)
โ Github flow์ ์์ ๊ณผ์
1. ๊ฐ์ธ ์์ ์ feature ๋ธ๋์น์์ ์์ ํ๋ฉฐ ์์ ์ด ๋๋๋ฉด pull request๋ฅผ ์์ฑํ๋ค
2. pull request์์ ์ฝ๋ ๋ฆฌ๋ทฐ ํ์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉด master ๋ณํฉํ๋ค.
3. master์ ๋ณํฉํ๋ฉด ๋ฐ๋ก ๋ฐฐํฌ ์์ ์ ์ํํ๋ค. (CI ์๋ํ ๊ถ์ฅ?)
master์ develop 2๊ฐ์ ๋ฉ์ธ ๋ธ๋์น๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ์์ workflow์ด๋ค. ์ด๋ ํญ์ ์ต์ ๋ฒ์ ์ ๋ฒ์ ์ ์ ์งํ์ง ์์๋ ๋๋ฉฐ ๋ฐฐํฌ ๋ฒ์ ๊ณผ ๊ฐ๋ฐ ๋ฒ์ ์ ๋ฐ๋ก ๋ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
โ Gitlab flow์ ์์ ๊ณผ์
1. develop ๋ธ๋์น๋ githubflow์ develop ๋ธ๋์น์ ๊ฐ์ ์ญํ ์ ํ๋ค. (ํญ์ ์ต์ ๋ฒ์ ์ ์ฝ๋๋ฅผ ๊ด๋ฆฌํ๋ฉฐ ์์ ์ ํ๋ ๋ฉ์ธ ๋ธ๋์น)
2. develop ๋ธ๋์น๊ฐ ๋ฐฐํฌ๋๊ธฐ ์ ํฉํ๋ค๊ณ ํ๋จ๋๋ฉด master ๋ธ๋์น์ mergeํ๋ค.
Git์ ํ ๋ธ๋์น์์ ์์ ํ ๋ด์ฉ์ Main ๋ธ๋์น์ ๋ณํฉ(Merge)ํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ๋ค์ ์ ๊ณตํ๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ๋ค์ Merge ์ ๋ต์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
: ๋ชจ๋ ๋ธ๋์น์ commit log์ merge log๊ฐ ๋์์ ๊ธฐ๋ก๋๋ ๋ฐฉ์์ด๋ค. ๊ธฐ๋ณธ ๋จธ์ง๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ Create a merge commit์, ๋ชจ๋ ๋ธ๋์น์ ์ปค๋ฐ์ด ํ์คํ ๋ฆฌ์ ๊ธฐ๋ก๋๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ปค๋ฐ ์ ๋ณด๋ฅผ ์์ธํ๊ฒ ํ์ ํ ์ ์์ผ๋ ๊ทธ๋งํผ ํ์คํ ๋ฆฌ๊ฐ ๋ณต์กํด์ง๋ ๋จ์ ์ด ์๋ค.
: ์ฌ๋ฌ ๊ฐ์ commit์ ํ๋๋ก ํฉ์น ํ mergeํ๋ ๋ฐฉ์์ด๋ค. ์์ ์๋ฃ๋ ๋ธ๋์น์ ์ปค๋ฐ์ ์๋ก์ด ์ปค๋ฐ์ผ๋ก ๋ชจ๋ ํฉ์ณ์ ธ main ๋ธ๋์น์ ํ๋์ ์ปค๋ฐ์ผ๋ก ๊ธฐ๋ก๋๊ณ , ๊ธฐ์กด์ ์์ ์๋ฃ๋ ๋ธ๋์น๋ ์ญ์ ๋๋ค. Create a merge commit๊ณผ ๋น๊ตํ์๋ฉด, ์์ธํ ์ปค๋ฐ ๊ธฐ๋ก์ ๊ดํ ์ ๋ณด๋ฅผ ์์ ์ ์์ผ๋ ๊ทธ๋งํผ ํ์คํ ๋ฆฌ๊ฐ ๊ฐ๊ฒฐํด์ง๋ค.
: Rebase ๊ธฐ๋ฅ์ ์ฌ์ฉํด ๋ธ๋์น๋ฅผ mergeํ๋ ๋ฐฉ์์ผ๋ก, ์ ๊ท branch์ ์์์ ์ main์ ๊ฐ์ฅ ์ต๊ทผ ์ปค๋ฐ์ผ๋ก (๊ฐ์ ๋ก) ์ฎ๊ธฐ๋ ๊ฒ์ด๋ค. rebase ๋๋ถ์ merge๋ ์ดํ์ ๋ก๊ทธ๋ฅผ ๋ณด์์ ๋ ํ๋์ ๋ธ๋์น์์ ์ฐ์์ ์ผ๋ก ์์ ํ ๊ฒ๊ณผ ๊ฐ์ ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์๋ค๋ ๊ฒ์ด ํน์ง์ด๋ฉฐ, ์ด ๋๋ฌธ์ ์ผ๋ง๋ ์ง ํญ์ ์ํ๋ ์์ค์ผ๋ก rollback์ด ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ๊ฐ์ ์ฑ์ ๊ฐ์ง๋๋งํผ, (rebase ์์ ์ด ํ์ํด์ง๋ ์ํฉ์) ๋ฐ์ํ ์ ์๋ ์ถฉ๋์ ์ ํด๊ฒฐํด์ผ ํ๋ค.
Rebase๋?
๋ฉ์ธ๋ธ๋์น๊ฐ ์๊ณ , ์๋ก์ด ๋ธ๋์น๋ฅผ ๋ง๋ค์ด ๋ ๋ธ๋์น๊ฐ ๊ฐ๊ฐ ์ถ๊ฐ์ ์ธ ์ปค๋ฐ์ ํ ๊ฒฝ์ฐ์์ ์๋ก์ด ๋ธ๋์น์ ์์์ ์ ๊ฐ์ ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ด๋ค.
์ฝ๊ฒ ๋งํ์๋ฉด, ์๋ก ์ ํ ์๊ด์ด ์๋ ๋ ๊ธฐ๋ฅ์ ๋ง๋ค์๊ณ , ๊ทธ ๊ธฐ๋ฅ์ด ์๋ฒฝํ๊ฒ ๊ตฌํ๋๋ค๋ฉด ๋์ ํฉ์น์ง ์์ ์ด์ ๊ฐ ์๋ค. ์ด๋ ์๋กญ๊ฒ ๋ง๋ค์ด๋ธ ๋ธ๋์น์ ์์์ ์, ๋ฉ์ธ ๋ธ๋์น์ ๋ง์ง๋ง ์ปค๋ฐ ์ง์ ์ผ๋ก ๊ฐ์ ๋ก ์ฎ๊ฒจ์ ํ๋๋ก ๋ง๋๋๋ฐ, ์ด๋ฅผ rebase๋ผ ํ๋ค.
Fast-forward Merge๋?
๋ฉ์ธ๋ธ๋์น๊ฐ ์๊ณ ์๋ก์ด ๋ธ๋์น๋ฅผ ๋ง๋ค์๋๋ฐ, ๋ฉ์ธ๋ธ๋์น๋ ์๋ก์ด ๋ณ๊ฒฝ์ฌํญ์ด ์๊ณ ์๋ก์ด ๋ธ๋์น๋ง ๋ณ๊ฒฝ์ฌํญ์ด ์๋ ์ํฉ์์, ๋จ์ํ ์๋ก์ด ๋ธ๋์น๋ฅผ ๋ฉ์ธ๋ธ๋์น๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ๋งํ๋ค.
(์์ผ๋ก ๋ป์ ํ๋์ ๊ฐ์ง๋ฅผ ๋ฉ์ธ์ผ๋ก ์ฅ ์ฎ๊ฒจ์ค๋ ๊ฒ์ด๋ค.)