[Git] ๐Ÿ›  Git, Github ์‚ฌ์šฉ๋ฒ• ๋ฐ ๋‚ด์šฉ ์ •๋ฆฌ

6690 ๋‹จ์–ด githubgitgit

๐Ÿ’Ž ๊ฐœ์š”


4ํ•™๋…„ ์ „๊ณต๊ณผ๋ชฉ์ธ S/W Engineering ์ˆ˜์—…์„ ๋“ค์œผ๋ฉด์„œ DevOps์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๋“ฃ๊ณ  ์ด๋ฅผ velog์— ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ๊ธ€์„ ๊ฒŒ์‹œํ•œ๋‹ค!!

CI/CD(Continuous Integration/Continuous Delivery(Deploy)) ํŒŒ์ดํ”„๋ผ์ธ์€ ๋” ์ž์ฃผ ๋” ์‹ ๋ขฐ์„ฑ ๋†’์€ ์ˆ˜์ •๋œ ์ฝ”๋“œ๋ฅผ deployํ•  ์ˆ˜ ์žˆ๋„๋ก SW๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ CI/CD ๊ฐœ๋ฐœ ๋ฌธํ™”๋“ค์€ DevOps ๋„๊ตฌ๋“ค์˜ ๋ฐœ์ „์œผ๋กœ ์ด์–ด์ง€๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ ์ด๋Š” ๋‹จ๊ณ„๋ณ„๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๊ฐœ๋ฐœ์—์„œ ํŠน์ • DevOps๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ํšจ์œจ์ ์ธ ๊ด€๋ฆฌ, ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ!! ์ด ๊ฒŒ์‹œ๊ธ€์€ ๊ทธ์ค‘์—์„œ๋„ Git์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ ๊ฒƒ ์ด๋‹ค. ๋˜ํ•œ Github๋ฅผ ์•Œ์•„๋ณด๋ฉด์„œ ์–ด๋–ค ์‹์œผ๋กœ ์›๊ฒฉ ์ €์žฅ์†Œ์™€ ๋กœ์ปฌ ์ €์žฅ์†Œ๊ฐ„์˜ Push, Pull์ด ์ด๋ฃจ์–ด์ง€๋Š”์ง€๋„ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

๐Ÿ’Ž Git


๐Ÿซ Git

Git์€ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์ •๋ง ๊ธฐ๋ณธ์ ์ด๊ณ  ํ•„์ˆ˜!!์ ์ธ DevOps๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž ์‚ฌ์ด์— ํ˜‘๋ ฅ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒ€ ๊ณต์œ  ์ž‘์—…์— ์ตœ์ ํ™”๋œ ๋„๊ตฌ์ธ ๋ถ„์‚ฐ VCS๊ตฌ์กฐ๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ํ•œ ๋ˆ„๊ฐ€ ์–ธ์ œ ๋ฌด์—‡์„ ์ˆ˜์ •ํ•˜์˜€๋Š”์ง€ trackingํ•˜๊ณ  ์ˆ˜์ •๋œ ๋‚ด์šฉ์„ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์ˆ˜์ ์œผ๋กœ ์•Œ์•„์•ผํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ์•„๋‹Œ๊ฐ€ ์ƒ๊ฐ๋œ๋‹ค.

์ด๋Ÿฌํ•œ Git์€ CI/CD์—์„œ๋„ version-control์ด ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” DevOps์ด๋‹ค.

๐Ÿซ Git structure

Git์€ working Directory, Staging Area, .git directory๋กœ ๋‚˜๋ˆ„์–ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ตฌ์กฐ๋Š” modified, staged, committed ๋‹จ๊ณ„๋กœ ๋˜ํ•œ ๋‚˜๋ˆ„์–ด์„œ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ํ•œ๋ฒˆ ๋ณด์ž!!

- Working Directory
ํ˜„์žฌ ์ž‘์—…ํ•˜๋Š” working directory์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ ์ž‘์—…ํ•œ ํ›„ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๋“ค์ด ์กด์žฌํ•  ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ modifiedํ•œ ์ƒํƒœ๋กœ ๋ณผ ์ˆ˜ ์žˆ๊ณ  ์ด๋Ÿฐ modified๋œ ๋‚ด์šฉ๋“ค์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  staging area๋กœ ๋ณด๋‚ด์ฃผ์–ด์•ผ ํ•œ๋‹ค!! ์ด๋Ÿฌํ•œ ์ž‘์—…์„ Stage Fixes๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

- Staging Area
์•ž์„œ ์ง„ํ–‰ํ•œ ์ˆ˜์ •๋œ ํŒŒ์ผ๋“ค์„ staging ์˜์—ญ์œผ๋กœ ๋ณด๋‚ด์ฃผ์—ˆ๋‹ค๋ฉด ์ด ์ง€์ ์—์„œ๋Š” commit์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์˜์—ญ์€ Staged๋œ ์ƒํƒœ์ด๋ฉฐ commit์„ ํ†ตํ•ด .git directory์— ์›ํ•˜๋Š” ๋ง์„ ์ถ”๊ฐ€ํ•ด์„œ ์–ด๋–ค ๋‚ด์šฉ์˜ ์ž‘์—…์ธ์ง€ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ Staging Area๋Š” ์บ์‹œ์˜์—ญ์ž„์„ ๊ธฐ์–ตํ•ด๋‘์ž!!

- .git directory(Repository)
๋งˆ์ง€๋ง‰์œผ๋กœ commit์„ ํ•˜์˜€๋‹ค๋ฉด ์ด๋ฅผ .git directory์—๋Š” commited๋œ ์ƒํƒœ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋‹ค์‹œ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์—…ํ•œ๋Š working directory๋กœ checkout๋  ์ˆ˜ ์žˆ๋Š”๋ฐ ๋‹ค์‹œ ๋Œ์•„๊ฐ€์„œ ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„ staging area๋ฅผ ๊ฑฐ์ณ git repository๋กœ commit ๋‚ด์šฉ์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ž‘์—…์ด ์ด๋ฃจ์–ด์ง„๋‹ค!!

๐Ÿซ Git command

๋จผ์ € ๋‚˜๋Š” m1 macbook proํ™˜๊ฒฝ์—์„œ git ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•ด์ฃผ์—ˆ๋‹ค!!
(๋˜ํ•œ git์„ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•œ homebrew ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ๊ฐ€์ •์—์„œ ์ถœ๋ฐœํ•œ๋‹ค!)

// git ์„ค์น˜
brew install git

git --version

homebrew๋ฅผ ์ด์šฉํ•˜์—ฌ git์„ ์„ค์น˜ํ•˜๊ตฌ git์˜ ๋ฒ„์ „์„ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค!!

๋‹ค์Œ์€ ๊ธฐ๋ณธ์ ์ธ git์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค!!

// .git ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ
git init

// stage ์˜์—ญ์œผ๋กœ file ์ถ”๊ฐ€ 
// add .ํ•˜๊ฒŒ ๋˜๋ฉด ๋ชจ๋“  ๋ณ€๊ฒฝ ํŒŒ์ผ stage์˜์—ญ์œผ๋กœ 
git add <file>

// modified, staged ์ƒํƒœ ํ™•์ธํ•˜๊ธฐ
git status

// ์ปค๋ฐ‹ํ•˜๊ธฐ
// -am ์€ add๋ฅผ ์ƒ๋žตํ•˜๊ณ  add์™€ commit์„ ๋™์‹œ์— ์ˆ˜ํ–‰
git commit -m "~"
git commit -am "~"

// name์€ ์‚ฌ์šฉ์ž ์ด๋ฆ„, email์€ ์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ ์„ค์ •ํ•˜๊ธฐ
git config --global user.name '~~'
git config --gloabl user.email '~~'

// git์˜ commit๋œ ๋‚ด์šฉ๋“ค, ํ˜„์žฌ head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” branch ํ™•์ธ ๋“ฑ ๋กœ๊ทธ๋ฅผ ํ™•์ธ
git log

๐Ÿซ Git branch & command

branch ์ž‘์—…์€ ๋ง๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๋ฅผ ์น˜๋Š” ๊ฒƒ์ด๋‹ค! ์ด ์ž‘์—…์„ ํ†ตํ•ด์„œ git์ด ์ƒˆ๋กœ์šด ์ž‘์—…์„ ๊ธฐ์กด์˜ ์ž‘์—…์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ๋ถ„๊ธฐํ•˜์—ฌ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค!! ๋‹ค์Œ ์‚ฌ์ง„์„ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๋น ๋ฅด๋‹ค.

์‚ฌ์ง„๊ณผ ๊ฐ™์ด C1 ๋ถ€๋ถ„์—์„œ ๋ถ„๊ธฐํ•˜์—ฌ C2์™€ C3์— ํ•ด๋‹นํ•˜๋Š” ์ƒˆ๋กœ์šด branch๋“ค์„ ์ƒ์„ฑํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” branch๋ฅผ ๋˜๋Œ์•„๊ฐˆ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ ๊ฐ์ž ๋งŒ๋“  branch์—์„œ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. Head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ถ€๋ถ„์€ ํ˜„์žฌ ์œ„์น˜ํ•œ ์ž‘์—… ์ƒํƒœ์ด๋ฉฐ ์ฒ˜์Œ ์ƒ์„ฑ๋œ head๋Š” master๋กœ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๋‚˜๋ˆ„์–ด์ง„ branch๋“ค์„ ํ†ตํ•ฉํ•˜๋Š” ๊ณผ์ •๋„ ์ค‘์š”ํ•˜๋‹ค. fast-forwarding ๋ฐฉ์‹์€ ์œ„ ์‚ฌ์ง„ ์ฒ˜๋Ÿผ c2์—์„œ ๋‚˜๋ˆ„์–ด์ง„ c3, c4์˜ branch๋“ค์ด ์กด์žฌํ•˜๋Š”๋ฐ c4์˜ ์ž‘์—…์„ ์ด์ „ c2์˜ ์ž‘์—…๊ณผ ๊ทธ๋Œ€๋กœ ์ด์–ด์ง€๋ฉด์„œ mergeํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ด๋Š” ์ด์ „ ์ž‘์—…์˜ ๋‚ด์šฉ๋“ค์„ ํฌํ•จํ•˜๊ณ  ๊ทธ๋Œ€๋กœ ์ด์–ด์ง€๋Š” merge ์ˆ˜ํ–‰๊ณผ์ •์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ 3-way merging๊ณผ์ •๋„ ์žˆ๋Š”๋ฐ ์ด๋Š” ์•ž์„œ ๋‘๊ฐˆ๋ž˜๊ธธ๋กœ ๋‚˜๋ˆ„์–ด์ง„ c3, c4์˜ branch๋“ค์„ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„ ์ž‘์—… ๊ณผ์ •์„ ๋น„๊ตํ•˜๊ณ  mergeํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ํ•˜์ง€๋งŒ ์–ธ์ œ๋‚˜ ์„œ๋กœ์˜ ์ž‘์—… ๋‚ด์šฉ์€ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ์œ„ํ•ด์„œ ๊ผญ merge coflict๋ฅผ ํ•ด์†Œ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ์ด๋Š” git์ด ์•Œ๋ ค์ฃผ์–ด ๊ฐœ๋ฐœ์ž๋“ค์ด ์กฐ์œจ์„ ํ†ตํ•ด ํŒŒ์ผ์˜ ์ˆœ์„œ๋ฅผ ๊ณ ์ณ์ฃผ๊ฑฐ๋‚˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•ด์คŒ์œผ๋กœ์จ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ๋‹ค!!

// branch ์ƒ์„ฑํ•˜๊ธฐ
git branch <branch name>

// ํ˜„์žฌ์˜ branch์—์„œ ์ž…๋ ฅ๋œ branch์™€ merge ์ˆ˜ํ–‰
git merge <branch name>

// ์ž…๋ ฅ๋œ branch๋กœ ๋ถ„๊ธฐ
git checkout <branch name>

๐Ÿ’Ž Github


๐Ÿซ Github

๊ทธ๋ ‡๋‹ค๋ฉด ์ง€๊ธˆ๊นŒ์ง€ git์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ github๋Š” ๋ฌด์—‡์ผ๊นŒ?? github๋Š” git๊ณผ ๋ถ„๋ช…ํžˆ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋กœ remote repository ์„œ๋น„์Šค๋กœ git์„ ์ด์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„์ด๋‹ค.

github๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜๋ฉด ์‚ฌ์šฉ์ž์˜ ๋กœ์ปฌ์—์„œ ์ง์ ‘ github ๊ณ„์ • ์•ˆ์˜ repository์— ํŒŒ์ผ์„ ์˜ฌ๋ ค ๋†“๊ณ  ๋‹ค์šด ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค!! ๋‹ค์‹œ๋งํ•ด์„œ github๋Š” git์˜ ์›๊ฒฉ ์ €์žฅ์†Œ ์„œ๋น„์Šค๋“ค ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค!!

๐Ÿซ Github commands

github๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ๋‹น์—ฐํžˆ! github์˜ ๊ณ„์ •์ด ํ•„์š”ํ•˜๋‹ค.
๐Ÿ‘‰ https://github.com/
ํšŒ์›๊ฐ€์ž…๊ณผ ํ•จ๊ป˜ github๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ „๊นŒ์ง€๋Š” ํŒจ์Šค์›Œ๋“œ ์ž…๋ ฅ์„ ํ†ตํ•ด์„œ pushํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ ์ด์ œ personal access token์„ ํ†ตํ•ด์„œ ์ธ์ฆ์„ ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ผญ setting -> developer setting -> personal access tokens -> generate token ์ ˆ์ฐจ๋ฅผ ํ†ตํ•ด ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ธฐ์–ตํ•ด๋‘๋„๋กํ•˜์ž!! (์ ์–ด๋†”์•ผ์ง€ ๋‹ค์‹œ ๋ณผ ์ˆ˜ ์—†์Œ. ๋ฉ”๋ชจ์žฅ์— ๊ธฐ์–ตํ•˜๊ธฐ)

// github์˜ ์›๊ฒฉ์ €์žฅ์†Œ์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ
git remote add origin <remote repository URL>

// github ์›๊ฒฉ์ €์žฅ์†Œ ํŒŒ์ผ๋“ค ๋‚ด๋ ค๋ฐ›๊ธฐ 
// ๋งˆ์ง€๋ง‰์— .์„ ์ž…๋ ฅํ•˜๋ฉด ํด๋”๋Š” ์ƒ๋žตํ•˜๊ณ  ๋‚ด์šฉ๋“ค์„ ๋ฐ›์•„์˜ด
git clone <remote repository URL>

// ์›๊ฒฉ์ €์žฅ์†Œ๋กœ ๋‚ด์šฉ push
git push origin <branch name>

// ์›๊ฒฉ์ €์žฅ์†Œ์˜ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ด
git pull

// fetch๋Š” ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋ฐ”๋กœ ๋ฐ˜์˜ํ•˜์ง€ ์•Š์Œ
// merge ๋ช…๋ น์„ ํ†ตํ•ด ๋กœ์ปฌ working directory์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Œ
git fetch origin

// fork๋Š” git ๋ช…๋ น์–ด๊ฐ€ ์•„๋‹˜!!!!

๐Ÿ’Ž ์ •๋ฆฌ


์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์ˆ˜์—…์‹œ๊ฐ„์— ๋ฐฐ์šด Git๊ณผ Github์˜ ๋‚ด์šฉ๋“ค์„ ์š”์•ฝํ•˜๊ณ  ๋ณต์Šตํ•ด๋ณด์•˜๋‹ค. ์•ž์œผ๋กœ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์ •๋ง ์ˆ˜๋„ ์—†์ด ๋งˆ์ฃผํ•˜๊ณ  ํ˜‘์—…์„ ์œ„ํ•œ ๋„๊ตฌ๋กœ์จ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋  DevOps์ธ git์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ํ•„์ˆ˜๋ผ๊ณ  ์ƒ๊ฐ๋œ๋‹ค. ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋งˆ์ฃผํ•˜๊ธฐ๋„ ํ•˜๊ฒ ์ง€๋งŒ ์ด๋Š” ์ž์ฃผ ์‚ฌ์šฉํ•ด์„œ ์ต์ˆ™ํ•ด์ง€๋„๋ก ํ•ด๋ณด์ž!!

๋ฒŒ์จ 4์›”์˜ ์ ˆ๋ฐ˜์ด ์ง€๋‚˜๊ฐ”๋‹ค. S/W Engineering ์ˆ˜์—…์—์„œ ๋˜ ๋‹ค๋ฅธ ๋‚ด์šฉ๋“ค์„ ๋ณต์Šตํ•  ๋•Œ ๋‹ค๋ฅธ DevOps๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋„๋กํ•˜์ž!!

ํ™”์ดํŒ…!!

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ