Y J S

Git ๊ธฐ์ดˆ ๊ฐ€์ด๋“œ: ๋ธŒ๋žœ์น˜ ์ „๋žต๋ถ€ํ„ฐ ๋˜๋Œ๋ฆฌ๊ธฐ๊นŒ์ง€

Git์€ ๋ฌด์—‡์ธ๊ฐ€

  • ๋ถ„์‚ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(Distributed VCS). ์Šค๋ƒ…์ƒท(์ปค๋ฐ‹) ๋‹จ์œ„๋กœ ์ฝ”๋“œ ์ด๋ ฅ์„ ๊ด€๋ฆฌํ•˜๊ณ , ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์‹คํ—˜ยทํ˜‘์—…ํ•œ๋‹ค.

ํ•ต์‹ฌ ๊ฐœ๋…

  • ์›Œํ‚น ๋””๋ ‰ํ† ๋ฆฌ/์Šคํ…Œ์ด์ง•/๋ฆฌํฌ์ง€ํ† ๋ฆฌ: ์ˆ˜์ • โ†’ git add(์Šคํ…Œ์ด์ง•) โ†’ git commit(์ €์žฅ)
  • ์ปค๋ฐ‹/๋ธŒ๋žœ์น˜/ํƒœ๊ทธ: ์Šค๋ƒ…์ƒท๊ณผ ํฌ์ธํ„ฐ. HEAD๋Š” ํ˜„์žฌ ์ฒดํฌ์•„์›ƒํ•œ ์ปค๋ฐ‹/๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ด
  • ์›๊ฒฉ(remote): origin ๋“ฑ ์„œ๋ฒ„ ์ €์žฅ์†Œ. fetch/pull/push๋กœ ๋™๊ธฐํ™”

์ž์ฃผ ์“ฐ๋Š” ๋ช…๋ น ๋ชจ์Œ

# ์ดˆ๊ธฐํ™”/๋ณต์ œ
git init
git clone <repo-url>

# ์ƒํƒœ/์ด๋ ฅ/์ฐจ์ด
git status
git log --oneline --graph --decorate --all
git diff          # ์›Œํ‚น vs ์Šคํ…Œ์ด์ง•
git diff --staged # ์Šคํ…Œ์ด์ง• vs ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹

# ์Šคํ…Œ์ด์ง•/์ปค๋ฐ‹
git add -p        # ์ฒญํฌ ๋‹จ์œ„ ์„ ํƒ์  ์Šคํ…Œ์ด์ง•
git commit -m "feat: add user login"

# ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ/์ด๋™/๋ณ‘ํ•ฉ
git switch -c feat/login
git switch main
git merge feat/login         # ๋ณ‘ํ•ฉ ์ปค๋ฐ‹
git rebase main              # ์„ ํ˜• ์ด๋ ฅ ๋งŒ๋“ค๊ธฐ(๋กœ์ปฌ์—์„œ ์‹ ์ค‘ํžˆ)

# ์›๊ฒฉ ๋™๊ธฐํ™”
git fetch                    # ์›๊ฒฉ ์ฐธ์กฐ๋งŒ ๊ฐฑ์‹ 
git pull --rebase            # ๊ฐ€์ ธ์˜ค๋ฉฐ ๋กœ์ปฌ ์œ„์— ์žฌ๋ฐฐ์น˜
git push -u origin HEAD

# ์ž„์‹œ ์ €์žฅ
git stash push -m "wip: refactor"
git stash pop

# ๋˜๋Œ๋ฆฌ๊ธฐ
git restore <file>           # ์›Œํ‚น ๋””๋ ‰ํ† ๋ฆฌ ๋˜๋Œ๋ฆฌ๊ธฐ
git reset --mixed HEAD~1     # ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ์ทจ์†Œ+์Šคํ…Œ์ด์ง• ํ•ด์ œ(๋กœ์ปฌ ์ •๋ฆฌ)
git reset --hard HEAD~1      # ๊ฐ•์ œ ๋˜๋Œ๋ฆผ(์ฃผ์˜)
git revert <commit>          # ๊ณต๊ฐœ ์ด๋ ฅ์—์„œ ์•ˆ์ „ํ•œ ๋˜๋Œ๋ฆฌ๊ธฐ

๋ธŒ๋žœ์น˜ ์ „๋žต(ํ˜‘์—…)

  • Trunk-based(์ถ”์ฒœ): ๋ณดํ˜ธ๋œ main + ์ž‘์€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(PR). ๋น ๋ฅธ ๋ณ‘ํ•ฉยท์งง์€ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„
  • Git Flow: develop/release/hotfix๊ฐ€ ๋ถ„๋ฆฌ๋œ ํฐ ํŒ€/๋ฆด๋ฆฌ์Šค ์ฃผ๊ธฐ ๊ธด ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉ
  • ๊ณตํ†ต ์›์น™: ์ž‘์€ PR, ๋ช…ํ™•ํ•œ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€(Conventional Commits), ํ•„์ˆ˜ ๋ฆฌ๋ทฐ/CI

์ถฉ๋Œ ๊ด€๋ฆฌ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

  • ์ž์ฃผ fetch/rebaseํ•ด ๋ณ€๊ฒฝ์„ ์ž‘๊ฒŒ ์œ ์ง€
  • ํŒŒ์ผ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ์ฒญํฌ/ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ์ˆ˜์ • ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”
  • ๋„๊ตฌ ํ™œ์šฉ: IDE ๋จธ์ง€ ๋„๊ตฌ, git mergetool
  • ํ•ด๊ฒฐ ํ›„: git add โ†’ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ํ™•์ธ โ†’ git rebase --continue ๋˜๋Š” ์ปค๋ฐ‹

๋˜๋Œ๋ฆฌ๊ธฐ ์„ ํƒ ๊ฐ€์ด๋“œ

  • ๋กœ์ปฌ ์ •๋ฆฌ: git reset(mixed/hard)
  • ๊ณต๊ฐœ ์ด๋ ฅ: git revert๋กœ ์—ญ์ปค๋ฐ‹ ์ƒ์„ฑ(ํžˆ์Šคํ† ๋ฆฌ ๋ณด์กด)
  • ์‹ค์ˆ˜ ๋ฐฉ์ง€: ๊ฐ•์ œ ํ‘ธ์‹œ๋Š” ์ตœ์†Œํ™”, ๋ณดํ˜ธ ๋ธŒ๋žœ์น˜ ์ •์ฑ… ํ™œ์šฉ

ํ’ˆ์งˆ๊ณผ ์ž๋™ํ™”

  • .gitignore ์ •๋ฆฌ๋กœ ๋ถˆํ•„์š” ํŒŒ์ผ ์ œ์™ธ
  • ์ปค๋ฐ‹ ํ›…(Husky)์œผ๋กœ ๋ฆฐํŠธ/ํ…Œ์ŠคํŠธ ์ž๋™ํ™”, CI์—์„œ ๋นŒ๋“œยทํ…Œ์ŠคํŠธ ๊ฐ•์ œ
  • git bisect๋กœ ํšŒ๊ท€ ๋ฒ„๊ทธ๋ฅผ ์ด๋ถ„ ํƒ์ƒ‰

๋งˆ๋ฌด๋ฆฌ

  • ์ž‘์€ ๋‹จ์œ„์˜ ์ปค๋ฐ‹/PR, ์ผ๊ด€๋œ ์ „๋žต, ์•ˆ์ „ํ•œ ๋˜๋Œ๋ฆฌ๊ธฐ ์Šต๊ด€์ด ํ˜‘์—… ์ƒ์‚ฐ์„ฑ์„ ์ขŒ์šฐํ•œ๋‹ค. ํŒ€ ๊ทœ๋ชจ์™€ ๋ฆด๋ฆฌ์Šค ์ฃผ๊ธฐ์— ๋งž์ถฐ Trunk-based ๋˜๋Š” Git Flow๋ฅผ ์„ ํƒํ•˜๊ณ , ์ž๋™ํ™”๋กœ ํ’ˆ์งˆ์„ ๋ณด์žฅํ•˜์ž.