์ดˆ๊ธฐ ์ƒํ™ฉ ์„ค์ •

# main ๋ธŒ๋žœ์น˜์—์„œ ์‹œ์ž‘
main: A โ”€ B โ”€ C
 
# feature ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ
git checkout -b feature
feature: A โ”€ B โ”€ C โ”€ D โ”€ E
 
# hotfix ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ (main์—์„œ)
git checkout main
git checkout -b hotfix
hotfix: A โ”€ B โ”€ C โ”€ F โ”€ G

ํ˜„์žฌ ์ƒํƒœ:

main:    A โ”€ B โ”€ C
feature:         โ””โ”€ D โ”€ E
hotfix:          โ””โ”€ F โ”€ G

1. Fast-Forward Merge

์กฐ๊ฑด

  • ๋Œ€์ƒ ๋ธŒ๋žœ์น˜์— ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์ด ์—†์„ ๋•Œ
  • ํ˜„์žฌ ๋ธŒ๋žœ์น˜๊ฐ€ ๋Œ€์ƒ ๋ธŒ๋žœ์น˜์˜ ์ง์ ‘์ ์ธ ํ›„์†์ผ ๋•Œ

์˜ˆ์‹œ

# main์œผ๋กœ ์ด๋™ํ•ด์„œ feature๋ฅผ merge
git checkout main
git merge feature

๊ฒฐ๊ณผ

main/feature: A โ”€ B โ”€ C โ”€ D โ”€ E
hotfix:               โ””โ”€ F โ”€ G

ํŠน์ง•

  • โœ… ์žฅ์ : ํฌ์ธํ„ฐ๋งŒ ์•ž์œผ๋กœ ์ด๋™, ๊น”๋”ํ•œ ํžˆ์Šคํ† ๋ฆฌ, merge ์ปค๋ฐ‹ ์—†์Œ
  • โŒ ๋‹จ์ : ๋ธŒ๋žœ์น˜ ์กด์žฌ ํ”์ ์ด ์‚ฌ๋ผ์ง

2. 3-way Merge (Non-fast-forward)

์กฐ๊ฑด

  • ๋‘ ๋ธŒ๋žœ์น˜ ๋ชจ๋‘ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์ด ์žˆ์„ ๋•Œ
  • ๋ธŒ๋žœ์น˜๋“ค์ด diverged ์ƒํƒœ์ผ ๋•Œ

์˜ˆ์‹œ

# main์— hotfix๋ฅผ merge (main์—๋Š” ์ด๋ฏธ feature๊ฐ€ merge๋จ)
git checkout main
git merge hotfix

๊ฒฐ๊ณผ

main: A โ”€ B โ”€ C โ”€ D โ”€ E โ”€ M
               โ””โ”€ F โ”€ G โ”€โ”˜

ํŠน์ง•

  • โœ… ์žฅ์ : ์ƒˆ๋กœ์šด merge ์ปค๋ฐ‹(M) ์ƒ์„ฑ, ๋ธŒ๋žœ์น˜ ํžˆ์Šคํ† ๋ฆฌ ๋ณด์กด, ์•ˆ์ „ํ•œ ๋ณ‘ํ•ฉ
  • โŒ ๋‹จ์ : ๋ณต์žกํ•œ ํžˆ์Šคํ† ๋ฆฌ, merge ์ปค๋ฐ‹ ์ฆ๊ฐ€

3. Rebase

๋ชฉ์ 

  • Linearํ•œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ
  • ์ปค๋ฐ‹์„ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ

์‹œ๋‚˜๋ฆฌ์˜ค: auth ๋ธŒ๋žœ์น˜๋ฅผ main ์œ„์— ์žฌ๋ฐฐ์น˜

# ์ดˆ๊ธฐ ์ƒํƒœ
main: A โ”€ B โ”€ C โ”€ H โ”€ I
auth:         โ””โ”€ D โ”€ E โ”€ F
 
# auth ๋ธŒ๋žœ์น˜์—์„œ rebase ์‹คํ–‰
git checkout auth
git rebase main

๊ฒฐ๊ณผ

main: A โ”€ B โ”€ C โ”€ H โ”€ I
auth:                 โ””โ”€ D' โ”€ E' โ”€ F'

ํŠน์ง•

  • โœ… ์žฅ์ : ์ปค๋ฐ‹๋“ค์ด ์ƒˆ๋กœ์šด base ์œ„์— ์žฌ์ ์šฉ, ์„ ํ˜•์ ์ด๊ณ  ๊น”๋”ํ•œ ํžˆ์Šคํ† ๋ฆฌ
  • โŒ ๋‹จ์ : ์ปค๋ฐ‹ ํ•ด์‹œ ๋ณ€๊ฒฝ, ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ, ๊ณต์œ ๋œ ๋ธŒ๋žœ์น˜์—์„œ๋Š” ์œ„ํ—˜

์‹ค์ œ ํ”„๋กœ์ ํŠธ ์˜ˆ์‹œ

ํ˜„์žฌ ๋ธŒ๋žœ์น˜ ์ƒํ™ฉ

main:        ... โ”€ M1 โ”€ M2
Feat/last-time:         โ””โ”€ L1 โ”€ L2 โ”€ L3
Feat/auth:              โ””โ”€ A1 โ”€ A2

1. Fast-forward (Feat/last-time โ†’ main)

git checkout main
git merge Feat/last-time  # Fast-forward ๋ฐœ์ƒ

๊ฒฐ๊ณผ: main: ... โ”€ M1 โ”€ M2 โ”€ L1 โ”€ L2 โ”€ L3

2. Fast-forward (main โ†’ Feat/auth)

git checkout Feat/auth
git merge main  # Fast-forward ๋ฐœ์ƒ

๊ฒฐ๊ณผ: Feat/auth: ... โ”€ M1 โ”€ M2 โ”€ L1 โ”€ L2 โ”€ L3 โ”€ A1 โ”€ A2

์–ธ์ œ ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ• ๊นŒ?

Fast-Forward

# ๊ฐœ์ธ feature ๋ธŒ๋žœ์น˜, ์„ ํ˜• ํžˆ์Šคํ† ๋ฆฌ ์›ํ•  ๋•Œ
git merge feature-branch

์‚ฌ์šฉ ์‹œ๊ธฐ:

  • ๊ฐœ์ธ ์ž‘์—… ๋ธŒ๋žœ์น˜
  • ๋น ๋ฅธ hotfix
  • ์„ ํ˜• ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

3-way Merge

# ๋ธŒ๋žœ์น˜ ํžˆ์Šคํ† ๋ฆฌ ๋ณด์กดํ•˜๊ณ  ์‹ถ์„ ๋•Œ
git merge --no-ff feature-branch

์‚ฌ์šฉ ์‹œ๊ธฐ:

  • ํŒ€ ์ž‘์—…์—์„œ ๋ธŒ๋žœ์น˜ ํžˆ์Šคํ† ๋ฆฌ ๋ณด์กด
  • Feature ์™„์„ฑ ์‹œ์ ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • ๋กค๋ฐฑ์ด ์‰ฌ์›Œ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

Rebase

# ๊น”๋”ํ•œ ํžˆ์Šคํ† ๋ฆฌ, ์ปค๋ฐ‹ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ
git rebase main
git rebase -i HEAD~3  # ๋Œ€ํ™”ํ˜• rebase๋กœ ์ปค๋ฐ‹ ์ •๋ฆฌ

์‚ฌ์šฉ ์‹œ๊ธฐ:

  • ๊ฐœ์ธ ๋ธŒ๋žœ์น˜ ์ •๋ฆฌ
  • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ˆ˜์ •
  • ๋ถˆํ•„์š”ํ•œ ์ปค๋ฐ‹ ์ œ๊ฑฐ
  • PR ์ „ ํžˆ์Šคํ† ๋ฆฌ ์ •๋ฆฌ

์ถฉ๋Œ ํ•ด๊ฒฐ ์ฐจ์ด

Merge ์ถฉ๋Œ

git merge feature
# ์ถฉ๋Œ ํ•ด๊ฒฐ ํ›„
git add .
git commit  # merge ์ปค๋ฐ‹ ์ƒ์„ฑ

Rebase ์ถฉ๋Œ

git rebase main
# ์ถฉ๋Œ ํ•ด๊ฒฐ ํ›„
git add .
git rebase --continue  # ๋‹ค์Œ ์ปค๋ฐ‹์œผ๋กœ ๊ณ„์†
# ๋˜๋Š” ์ค‘๋‹จ: git rebase --abort

ํŒ€ ์ž‘์—… ๊ถŒ์žฅ์‚ฌํ•ญ

1. Feature ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ

์ด์œ 

Feature ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ ๊ถŒ์žฅ์‚ฌํ•ญ

์›Œํฌํ”Œ๋กœ์šฐ ๋‹จ๊ณ„

# 1. Feature ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…
git checkout -b feature/new-function
 
# 2. ์ž‘์—… ์™„๋ฃŒ ํ›„ main ๋ธŒ๋žœ์น˜ ์ตœ์‹ ํ™”
git checkout main
git pull origin main
 
# 3. Feature ๋ธŒ๋žœ์น˜์— main ๋‚ด์šฉ rebase
git checkout feature/new-function
git rebase main
 
# 4. Main์— Fast-forward merge
git checkout main
git merge feature/new-function

์™œ ์ด ๋ฐฉ์‹์ด ๊ถŒ์žฅ๋˜๋Š”๊ฐ€?

1. ์•ˆ์ „ํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • ๐Ÿ›ก๏ธ main ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ: ์‹คํ—˜์  ์ฝ”๋“œ๊ฐ€ main์— ์˜ํ–ฅ ์ฃผ์ง€ ์•Š์Œ
  • ๐Ÿ‘ฅ ๋ณ‘๋ ฌ ์ž‘์—…: ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์‹œ์— ๋‹ค๋ฅธ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ
  • ๐Ÿงช ์‹คํ—˜ ๊ฐ€๋Šฅ: ์‹คํŒจํ•ด๋„ main์— ์˜ํ–ฅ ์—†์Œ

2. ์ตœ์‹  ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ

  • ๐Ÿ“ฑ ์ตœ์‹  ๋ฐ˜์˜: ๋‹ค๋ฅธ ํŒ€์›์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ฆ‰์‹œ ๋ฐ˜์˜
  • ๐Ÿšซ ์ถฉ๋Œ ์ตœ์†Œํ™”: ์˜ค๋ž˜๋œ base์—์„œ ์ž‘์—…ํ•˜์ง€ ์•Š์Œ
  • ๐Ÿ”„ ์ง€์†์  ํ†ตํ•ฉ: ๋งค๋ฒˆ ์ตœ์‹  ์ƒํƒœ์—์„œ ๊ฐœ๋ฐœ

3. ๊น”๋”ํ•œ ํžˆ์Šคํ† ๋ฆฌ

# โœ… ๊ถŒ์žฅ ๋ฐฉ์‹: ์„ ํ˜• ํžˆ์Šคํ† ๋ฆฌ
main: A โ”€ B โ”€ C โ”€ D โ”€ E โ”€ F โ”€ G
              โ†‘feat1  โ†‘feat2
 
# โŒ ๋น„๊ถŒ์žฅ: ๋ณต์žกํ•œ ํžˆ์Šคํ† ๋ฆฌ  
main: A โ”€ B โ”€ C โ”€ F โ”€ G โ”€ M1 โ”€ H โ”€ M2
           โ””โ”€ D โ”€ E โ”€โ”˜     โ””โ”€ I โ”€โ”˜

4. ์•ˆ์ „ํ•œ ์ถฉ๋Œ ํ•ด๊ฒฐ

  • โœ… ๊ฒฉ๋ฆฌ๋œ ์ˆ˜์ •: feature ๋ธŒ๋žœ์น˜์—์„œ๋งŒ ์ถฉ๋Œ ํ•ด๊ฒฐ
  • ๐Ÿšซ main ๋ณดํ˜ธ: main ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ 
  • ๐Ÿ’ฏ ํ™•์‹ : merge ์‹œ์ ์— ์ถฉ๋Œ ์—†์Œ ๋ณด์žฅ

์žฅ์  ์š”์•ฝ

  1. ๊ฐœ๋ฐœ ์•ˆ์ „์„ฑ: main ๋ธŒ๋žœ์น˜๊ฐ€ ํ•ญ์ƒ ์•ˆ์ •์ 
  2. ํŒ€ ํ˜‘์—…: ๋ณ‘๋ ฌ ๊ฐœ๋ฐœ๊ณผ ์ฝ”๋“œ ํ†ตํ•ฉ ์šฉ์ด
  3. ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ: ๊น”๋”ํ•˜๊ณ  ์ถ”์  ๊ฐ€๋Šฅํ•œ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ
  4. ์ถฉ๋Œ ์ตœ์†Œํ™”: ์ฒด๊ณ„์ ์ธ ์ถฉ๋Œ ํ•ด๊ฒฐ ๊ณผ์ •
์›๋ณธ ๋งํฌ



2. Release ๋ธŒ๋žœ์น˜

์ด์œ 

Release ๋ธŒ๋žœ์น˜ ์ „๋žต

Release ๋ธŒ๋žœ์น˜ ์ „๋žต

๊ถŒ์žฅ ๋ช…๋ น์–ด

# Release ๋ธŒ๋žœ์น˜๋Š” 3-way merge๋กœ ํžˆ์Šคํ† ๋ฆฌ ๋ณด์กด
git checkout main
git merge --no-ff release/v1.2.0

์™œ 3-way Merge๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

1. ๋ฆด๋ฆฌ์ฆˆ ํžˆ์Šคํ† ๋ฆฌ ๋ณด์กด

# โœ… 3-way merge: ๋ฆด๋ฆฌ์ฆˆ ์ง€์  ๋ช…ํ™•
main: A โ”€ B โ”€ C โ”€ F โ”€ G โ”€ M
                โ””โ”€ D โ”€ E โ”€โ”˜
                  v1.2.0
 
# โŒ Fast-forward: ๋ฆด๋ฆฌ์ฆˆ ํ”์  ์—†์Œ
main: A โ”€ B โ”€ C โ”€ D โ”€ E โ”€ F
                        โ†‘
                    v1.2.0?

2. ์‰ฌ์šด ๋กค๋ฐฑ

  • ๐Ÿ”„ ๋น ๋ฅธ ๋ณต๊ตฌ: git reset --hard HEAD~1๋กœ ๋ฆด๋ฆฌ์ฆˆ ์ „ ์ƒํƒœ๋กœ ์ฆ‰์‹œ ๋ณต๊ตฌ
  • ๐Ÿ“ ๋ช…ํ™•ํ•œ ์ง€์ : ์–ด๋””๊นŒ์ง€๊ฐ€ ๋ฆด๋ฆฌ์ฆˆ์ธ์ง€ ํ•œ๋ˆˆ์— ํŒŒ์•…
  • ๐Ÿ›ก๏ธ ์•ˆ์ „์„ฑ: ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์‹ ์†ํ•œ ๋Œ€์‘ ๊ฐ€๋Šฅ

3. ๋ฆด๋ฆฌ์ฆˆ ์ถ”์ ์„ฑ

  • ๐Ÿ“… ์‹œ์  ๊ธฐ๋ก: ์ •ํ™•ํ•œ ๋ฆด๋ฆฌ์ฆˆ ์‹œ๊ฐ„๊ณผ ๋‚ด์šฉ ์ถ”์ 
  • ๐Ÿท๏ธ ๋ฒ„์ „ ์—ฐ๊ฒฐ: ํƒœ๊ทธ์™€ merge commit์˜ ๋ช…ํ™•ํ•œ ์—ฐ๊ฒฐ
  • ๐Ÿ“ ๋ณ€๊ฒฝ ๋‚ด์—ญ: ํ•ด๋‹น ๋ฆด๋ฆฌ์ฆˆ์— ํฌํ•จ๋œ ๊ธฐ๋Šฅ๋“ค ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„

Release ์›Œํฌํ”Œ๋กœ์šฐ

1. Release ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ

git checkout -b release/v1.2.0 main

2. ๋ฆด๋ฆฌ์ฆˆ ์ค€๋น„ ์ž‘์—…

# ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ
echo "v1.2.0" > VERSION
git commit -m "Bump version to v1.2.0"
 
# ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ ์ž‘์„ฑ
git commit -m "Update CHANGELOG for v1.2.0"

3. ํ…Œ์ŠคํŠธ ๋ฐ ๋ฒ„๊ทธ ์ˆ˜์ •

# ๋ฆด๋ฆฌ์ฆˆ ๊ด€๋ จ ๋ฒ„๊ทธ๋งŒ ์ˆ˜์ •
git commit -m "Fix: Critical payment validation bug"

4. Main์— Merge

git checkout main
git merge --no-ff release/v1.2.0
git tag -a v1.2.0 -m "Release version 1.2.0"

โ€”no-ff ํ”Œ๋ž˜๊ทธ์˜ ์ค‘์š”์„ฑ

Fast-forward์˜ ๋ฌธ์ œ์ 

  • ๋ฆด๋ฆฌ์ฆˆ ์ž‘์—…์ด ์ผ๋ฐ˜ ๊ฐœ๋ฐœ๊ณผ ๊ตฌ๋ถ„๋˜์ง€ ์•Š์Œ
  • ๋กค๋ฐฑ ์‹œ ๊ฐœ๋ณ„ ์ปค๋ฐ‹์„ ํ•˜๋‚˜์”ฉ ๋˜๋Œ๋ ค์•ผ ํ•จ
  • ๋ฆด๋ฆฌ์ฆˆ์— ํฌํ•จ๋œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›€

โ€”no-ff์˜ ์žฅ์ 

  • ๐ŸŽฏ ๋ช…ํ™•ํ•œ ๊ตฌ๋ถ„: ๋ฆด๋ฆฌ์ฆˆ ์ž‘์—…๊ณผ ์ผ๋ฐ˜ ๊ฐœ๋ฐœ ๊ตฌ๋ถ„
  • ๐Ÿ“Š ํ†ต๊ณ„ ๊ฐ€๋Šฅ: ๋ฆด๋ฆฌ์ฆˆ๋ณ„ ์ž‘์—…๋Ÿ‰ ์ธก์ • ์šฉ์ด
  • ๐Ÿ” ๊ฒ€ํ†  ์šฉ์ด: ๋ฆด๋ฆฌ์ฆˆ ๋ฒ”์œ„๋ฅผ ํ•œ๋ˆˆ์— ํŒŒ์•…

Feature vs Release ๋น„๊ต

๊ตฌ๋ถ„Feature ๋ธŒ๋žœ์น˜Release ๋ธŒ๋žœ์น˜
๋ชฉ์ ์ƒˆ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๋ฆด๋ฆฌ์ฆˆ ์ค€๋น„
Merge ๋ฐฉ์‹Fast-forward3-way merge (โ€”no-ff)
ํžˆ์Šคํ† ๋ฆฌ์„ ํ˜• ์œ ์ง€ํžˆ์Šคํ† ๋ฆฌ ๋ณด์กด
๋กค๋ฐฑ๊ฐœ๋ณ„ ์ปค๋ฐ‹์ „์ฒด ๋ฆด๋ฆฌ์ฆˆ ๋‹จ์œ„
์ถ”์ ์„ฑ๊ธฐ๋Šฅ๋ณ„๋ฒ„์ „๋ณ„

์žฅ์  ์š”์•ฝ

  1. ๋ช…ํ™•ํ•œ ๋ฆด๋ฆฌ์ฆˆ ํฌ์ธํŠธ: ์–ธ์ œ ๋ฌด์—‡์ด ๋ฆด๋ฆฌ์ฆˆ๋˜์—ˆ๋Š”์ง€ ๋ช…ํ™•
  2. ์‰ฌ์šด ๋กค๋ฐฑ: ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ๋น ๋ฅธ ๋ณต๊ตฌ ๊ฐ€๋Šฅ
  3. ๋ฒ„์ „ ๊ด€๋ฆฌ: ์ฒด๊ณ„์ ์ธ ๋ฒ„์ „ ํžˆ์Šคํ† ๋ฆฌ ์œ ์ง€
  4. ํŒ€ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜: ๋ฆด๋ฆฌ์ฆˆ ๋ฒ”์œ„์™€ ๋‚ด์šฉ์„ ์‰ฝ๊ฒŒ ๊ณต์œ 
์›๋ณธ ๋งํฌ


3. Hotfix ๋ธŒ๋žœ์น˜

์ด์œ 

Hotfix ๋ธŒ๋žœ์น˜ ์ „๋žต

Hotfix ๋ธŒ๋žœ์น˜ ์ „๋žต

๊ถŒ์žฅ ๋ช…๋ น์–ด

# Hotfix๋Š” Fast-forward merge๋กœ ๋น ๋ฅธ ์ ์šฉ
git checkout main
git merge hotfix/critical-bug

์™œ Fast-forward Merge๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

1. ์‹ ์†ํ•œ ๋ฐฐํฌ

# โœ… Fast-forward: ์ฆ‰์‹œ ์ ์šฉ
main: A โ”€ B โ”€ C โ”€ D โ”€ E โ”€ F
                        โ†‘
                   hotfix ์ฆ‰์‹œ ์ ์šฉ
 
# โŒ 3-way merge: ๋ถˆํ•„์š”ํ•œ ์‹œ๊ฐ„ ์†Œ์š”
main: A โ”€ B โ”€ C โ”€ F โ”€ G โ”€ M
                โ””โ”€ D โ”€ E โ”€โ”˜
                  (์‹œ๊ฐ„ ๋‚ญ๋น„)

2. ๋‹จ์ˆœ์„ฑ ์šฐ์„ 

  • ๐Ÿšจ ๊ธด๊ธ‰ ์ƒํ™ฉ: ๋ณต์žกํ•œ ๊ณผ์ •๋ณด๋‹ค ๋น ๋ฅธ ํ•ด๊ฒฐ์ด ์šฐ์„ 
  • ๐ŸŽฏ ๋ช…ํ™•ํ•œ ๋ชฉ์ : ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋งŒ ํ•ด๊ฒฐ (๋ณดํ†ต 1-2๊ฐœ ์ปค๋ฐ‹)
  • โšก ์ฆ‰์‹œ ๋ฐ˜์˜: merge commit ์ƒ์„ฑ ์‹œ๊ฐ„๋„ ์ ˆ์•ฝ

3. ์‹ค์ˆ˜ ๋ฐฉ์ง€

  • ๐Ÿšซ ๋ณต์žก์„ฑ ์ œ๊ฑฐ: ๊ธด๊ธ‰ ์ƒํ™ฉ์—์„œ ๋‹จ์ˆœํ•œ ๊ณผ์ •์œผ๋กœ ์‹ค์ˆ˜ ์ตœ์†Œํ™”
  • ๐Ÿ”ง ์ง‘์ค‘: ๋ฌธ์ œ ํ•ด๊ฒฐ์—๋งŒ ์ง‘์ค‘, ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ๋Š” ๋‚˜์ค‘์—
  • โœ… ํ™•์‹ค์„ฑ: ๋น ๋ฅด๊ณ  ํ™•์‹คํ•œ ์ ์šฉ

Hotfix ์›Œํฌํ”Œ๋กœ์šฐ

1. ๊ธด๊ธ‰ ์ƒํ™ฉ ๋ฐœ์ƒ

๐Ÿšจ ALERT: Critical production bug detected!

2. Hotfix ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ

git checkout main  # ํ˜„์žฌ ํ”„๋กœ๋•์…˜ ๋ฒ„์ „
git checkout -b hotfix/payment-crash

3. ๋น ๋ฅธ ์ˆ˜์ •

git commit -m "Fix: Null pointer exception in payment validation"

4. ์ฆ‰์‹œ ๋ฐฐํฌ

git checkout main
git merge hotfix/payment-crash  # Fast-forward
git tag v1.2.1  # ๊ฐ„๋‹จํ•œ ํƒœ๊ทธ (๋ฐฐํฌ ํŠธ๋ฆฌ๊ฑฐ)
git push origin main v1.2.1

5. ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์—๋„ ๋ฐ˜์˜

# ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜์—๋„ ์ ์šฉ (์ค‘๋ณต ๋ฒ„๊ทธ ๋ฐฉ์ง€)
git checkout develop
git merge hotfix/payment-crash

์‹œ๊ฐ„ ๋น„๊ต ์˜ˆ์‹œ

Fast-forward ๋ฐฉ์‹ (๊ถŒ์žฅ)

13:00 - ๋ฒ„๊ทธ ๋ฐœ๊ฒฌ
13:05 - hotfix ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ  
13:15 - ์ˆ˜์ • ์™„๋ฃŒ
13:16 - merge, ํƒœ๊ทธ, ํ‘ธ์‹œ
13:20 - ์„œ๋น„์Šค ์ •์ƒํ™”

3-way merge ๋ฐฉ์‹ (๋น„๊ถŒ์žฅ)

13:00 - ๋ฒ„๊ทธ ๋ฐœ๊ฒฌ
13:05 - hotfix ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ
13:15 - ์ˆ˜์ • ์™„๋ฃŒ  
13:18 - merge commit ์ž‘์„ฑ
13:22 - merge ์™„๋ฃŒ ๋ฐ ๋ฐฐํฌ
13:27 - ์„œ๋น„์Šค ์ •์ƒํ™”

๊ฒฐ๊ณผ: 7๋ถ„์˜ ๋‹ค์šดํƒ€์ž„ ๋‹จ์ถ•!

๋ธŒ๋žœ์น˜๋ณ„ ์ „๋žต ๋น„๊ต

๊ตฌ๋ถ„FeatureReleaseHotfix
๊ธด๊ธ‰๋„๋‚ฎ์Œ์ค‘๊ฐ„๐Ÿšจ ๋†’์Œ
Merge ๋ฐฉ์‹Fast-forward3-way mergeFast-forward
์ด์œ ๊น”๋”ํ•œ ํžˆ์Šคํ† ๋ฆฌํžˆ์Šคํ† ๋ฆฌ ๋ณด์กด๋น ๋ฅธ ๋ฐฐํฌ
์šฐ์„ ์ˆœ์œ„ํ’ˆ์งˆ๊ณ„ํš์„ฑ์†๋„

์–ธ์ œ Hotfix๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

โœ… Hotfix ์‚ฌ์šฉ ์ƒํ™ฉ

  • ๐Ÿšจ ํ”„๋กœ๋•์…˜ ์žฅ์• : ์„œ๋น„์Šค ์ค‘๋‹จ ์ƒํ™ฉ
  • ๐Ÿ”’ ๋ณด์•ˆ ์ทจ์•ฝ์ : ์ฆ‰์‹œ ํŒจ์น˜ ํ•„์š”
  • ๐Ÿ’ฐ ๋น„์ฆˆ๋‹ˆ์Šค ํฌ๋ฆฌํ‹ฐ์ปฌ: ๋งค์ถœ์— ์ง์ ‘ ์˜ํ–ฅ
  • ๐Ÿ“Š ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ: ๋ฐ์ดํ„ฐ ์†์‹ค ์œ„ํ—˜

โŒ Hotfix ๋‚จ์šฉ ์ฃผ์˜

  • ๐Ÿ› ์ผ๋ฐ˜์ ์ธ ๋ฒ„๊ทธ โ†’ ๋‹ค์Œ ๋ฆด๋ฆฌ์ฆˆ ํฌํ•จ
  • ๐ŸŽจ UI ๊ฐœ์„  โ†’ ๊ณ„ํš๋œ ๊ฐœ๋ฐœ ์ง„ํ–‰
  • โšก ์„ฑ๋Šฅ ์ตœ์ ํ™” โ†’ Feature ๋ธŒ๋žœ์น˜ ์‚ฌ์šฉ
  • ๐Ÿ“ฑ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ โ†’ Feature ๋ธŒ๋žœ์น˜ ์‚ฌ์šฉ

์ฃผ์˜์‚ฌํ•ญ

ํ•„์ˆ˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • โœ… ํ…Œ์ŠคํŠธ: ๋น ๋ฅด๋”๋ผ๋„ ํ•ต์‹ฌ ํ…Œ์ŠคํŠธ๋Š” ํ•„์ˆ˜
  • โœ… ๋ฌธ์„œํ™”: ๊ธด๊ธ‰ ์ˆ˜์ • ๋‚ด์šฉ ๊ธฐ๋ก
  • โœ… ์ „ํŒŒ: ๋ชจ๋“  ๊ด€๋ จ ๋ธŒ๋žœ์น˜์— ๋ฐ˜์˜
  • โœ… ๋ชจ๋‹ˆํ„ฐ๋ง: ๋ฐฐํฌ ํ›„ ์ฆ‰์‹œ ํ™•์ธ

์žฅ์  ์š”์•ฝ

  1. ์ตœ๋Œ€ ์†๋„: ๊ธด๊ธ‰ ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ๋น ๋ฅธ ๋Œ€์‘
  2. ๋‹จ์ˆœ์„ฑ: ๋ณต์žกํ•œ ๊ณผ์ • ์—†์ด ์ฆ‰์‹œ ์ ์šฉ
  3. ์‹ค์ˆ˜ ๋ฐฉ์ง€: ๊ฐ„๋‹จํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ์‹ค์ˆ˜ ์ตœ์†Œํ™”
  4. ์ง‘์ค‘: ๋ฌธ์ œ ํ•ด๊ฒฐ์—๋งŒ ์ง‘์ค‘ ๊ฐ€๋Šฅ
์›๋ณธ ๋งํฌ


์ฃผ์˜์‚ฌํ•ญ

โš ๏ธ Rebase ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์ 

  • ์ ˆ๋Œ€๋กœ ๊ณต์œ ๋œ ๋ธŒ๋žœ์น˜๋ฅผ rebaseํ•˜์ง€ ๋งˆ์„ธ์š”
  • ์ด๋ฏธ push๋œ ์ปค๋ฐ‹์„ rebaseํ•˜๋ฉด ๋‹ค๋ฅธ ํŒ€์›์—๊ฒŒ ๋ฌธ์ œ ๋ฐœ์ƒ
  • git push --force๋Š” ๋งค์šฐ ์œ„ํ—˜ํ•จ

๐Ÿ” ํžˆ์Šคํ† ๋ฆฌ ํ™•์ธ ๋ช…๋ น์–ด

# ๊ทธ๋ž˜ํ”„๋กœ ํžˆ์Šคํ† ๋ฆฌ ๋ณด๊ธฐ
git log --oneline --graph --all
 
# ํŠน์ • ๋ธŒ๋žœ์น˜ ๊ฐ„ ์ฐจ์ด ๋ณด๊ธฐ
git log main..feature
 
# ๋จธ์ง€ ์ปค๋ฐ‹๋งŒ ๋ณด๊ธฐ
git log --merges

์ •๋ฆฌ

๋ฐฉ๋ฒ•์‚ฌ์šฉ ์‹œ๊ธฐ์žฅ์ ๋‹จ์ 
Fast-forward๊ฐœ์ธ ์ž‘์—…, ๊ฐ„๋‹จํ•œ ๋ณ€๊ฒฝ๊น”๋”ํ•œ ํžˆ์Šคํ† ๋ฆฌ๋ธŒ๋žœ์น˜ ํ”์  ์—†์Œ
3-way MergeํŒ€ ์ž‘์—…, ์ค‘์š”ํ•œ ๊ธฐ๋Šฅํžˆ์Šคํ† ๋ฆฌ ๋ณด์กด, ์•ˆ์ „๋ณต์žกํ•œ ๊ทธ๋ž˜ํ”„
Rebase์ปค๋ฐ‹ ์ •๋ฆฌ, ์„ ํ˜• ํžˆ์Šคํ† ๋ฆฌ๊น”๋”ํ•œ ๋ผ์ธ์œ„ํ—˜์„ฑ, ์ถฉ๋Œ ๊ฐ€๋Šฅ

์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ ํƒํ•˜์—ฌ ๊น”๋”ํ•˜๊ณ  ์ถ”์  ๊ฐ€๋Šฅํ•œ Git ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜์„ธ์š”!