Post

[Git] 4. branch & merge

๐Ÿš€ branch ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 


  • ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒ„์ „์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด
    • ์‹ค๋ฐฐํฌ์šฉ, ํ…Œ์ŠคํŠธ์šฉ, ๊ธฐ๋Šฅ์ถ”๊ฐ€ ๋“ฑ
  • ์—ฌ๋Ÿฌ ์ž‘์—…๋“ค์ด ๊ฐ๊ฐ ๋…๋ฆฝ๋˜์–ด ์ง„ํ–‰๋  ๋•Œ
    • ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ, ๊ฒŒ์‹œํŒ ๊ธฐ๋Šฅ, ์ฝ”๋“œ ์ˆ˜์ •โ€ฆ
    • ๊ฐ๊ฐ์˜ branch ์—์„œ ์ž‘์—…ํ•œ ๋’ค ํ™•์ •๋œ ๊ฒƒ์„ main branch์— merge

๐Ÿš€ branch ์ƒ์„ฑํ•˜๊ธฐ


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# ํ˜„์žฌ ๋กœ์ปฌ์— ์žˆ๋Š” ๋ธŒ๋žœ์น˜ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค€๋‹ค
git branch

# ์›๊ฒฉ ๋ธŒ๋žœ์น˜ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค€๋‹ค
git branch -r

# feat/login ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ
git branch feat/login

# feat/login ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น ๋ธŒ๋žœ์น˜๋กœ ์ด๋™
git switch -c feat/login # ์‹ ๊ทœ
git checkout -b feat/login # ๊ธฐ์กด (checkout ๋ช…๋ น์–ด๊ฐ€ switch, restore๋กœ ๋ถ„๋ฆฌ)

# ๋ธŒ๋žœ์น˜ ์‚ญ์ œ
git branch -d (์‚ญ์ œํ•  ๋ธŒ๋žœ์น˜๋ช…)

# ์›๊ฒฉ ๋ธŒ๋žœ์น˜ ์‚ญ์ œ
git push origin --delete (์‚ญ์ œํ•  ๋ธŒ๋žœ์น˜๋ช…)

# ๋ธŒ๋žœ์น˜๋ช… ๋ณ€๊ฒฝ
git branch -m (๊ธฐ์กด ๋ธŒ๋žœ์น˜๋ช…) (์ƒˆ ๋ธŒ๋žœ์น˜๋ช…)

# ๊ฐ•์ œ ์‚ญ์ œ
git branch -D (์‚ญ์ œํ•  ๋ธŒ๋žœ์น˜๋ช…)

๐Ÿš€ branch ์‹ค๋ฌด ํ™œ์šฉ


image

1๏ธโƒฃ ๊ธฐ๋Šฅ/๋ฒ„๊ทธ/์ž‘์—… ๋‹จ์œ„๋ณ„ ๋ธŒ๋žœ์น˜

  • ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ™œ์šฉ ๋ฐฉ์‹์œผ๋กœ, ์ž‘์—… ๋‹จ์œ„๋ฅผ ๋ถ„๋ฆฌํ•ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ
  • ์˜ˆ
    • feature/user-profile: ์ƒˆ ํ”„๋กœํ•„ ๊ธฐ๋Šฅ
    • fix/login-error: ๋กœ๊ทธ์ธ ์—๋Ÿฌ ์ˆ˜์ •
    • chore/update-dependencies: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—…๋ฐ์ดํŠธ
  • ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ง„ํ–‰, ์ฝ”๋“œ ์ถฉ๋Œ ์ตœ์†Œํ™”

2๏ธโƒฃ PR(Pull Request) ๋‹จ์œ„๋กœ ๋ธŒ๋žœ์น˜ ํ™œ์šฉ

  • ๋ธŒ๋žœ์น˜๋งˆ๋‹ค ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด PR์„ ์ƒ์„ฑํ•˜์—ฌ ์ฝ”๋“œ๋ฆฌ๋ทฐ ์ง„ํ–‰
  • PR์„ ํ†ตํ•ด ์ฝ”๋“œ ํ’ˆ์งˆ์„ ํ™•์ธํ•˜๊ณ , ์Šน์ธ ํ›„ main์— merge
  • merge๋˜๋ฉด ์ž‘์—… ๋ธŒ๋žœ์น˜๋Š” ์‚ญ์ œ (ํžˆ์Šคํ† ๋ฆฌ ์ •๋ฆฌ๋ฅผ ์œ„ํ•จ)

3๏ธโƒฃ ๋ธŒ๋žœ์น˜๋ฅผ ํ™˜๊ฒฝ๋ณ„๋กœ ๋‚˜๋ˆ ์„œ ์ž‘์—…

  • ๊ทœ๋ชจ ์žˆ๋Š” ์„œ๋น„์Šค์—์„œ๋Š” ๋ฐฐํฌ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋ธŒ๋žœ์น˜๋ฅผ ๊ตฌ๋ถ„ํ•ด ์•ˆ์ •์„ฑ์„ ํ™•๋ณด
  • ์˜ˆ
    • main: ์šด์˜ ํ™˜๊ฒฝ(Production)์šฉ, ๋ฐฐํฌ ๊ธฐ์ค€ ๋ธŒ๋žœ์น˜
    • develop: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์šฉ, ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋“ค์„ ๋จธ์ง€ํ•ด ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
    • release/v1.2.0: ํŠน์ • ๋ฒ„์ „ ์ค€๋น„๋ฅผ ์œ„ํ•œ ๋ฐฐํฌ ํ›„๋ณด ๋ธŒ๋žœ์น˜
  • ํŒ€๋งˆ๋‹ค Git flow, Github flow, trunk-based development ๋“ฑ ๋‹ค์–‘ํ•œ ์ „๋žต์„ ํƒํ•œ๋‹ค.

4๏ธโƒฃ ๊ธด๊ธ‰ ์ˆ˜์ •์šฉ ํ•ซํ”ฝ์Šค ๋ธŒ๋žœ์น˜

  • ์šด์˜ ์ค‘ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด main ๋ธŒ๋žœ์น˜์—์„œ ๋ฐ”๋กœ hotfix/issue-name์„ ๋”ฐ์„œ ์ˆ˜์ • ํ›„ main์— merge (๋น ๋ฅธ ๋Œ€์‘)
  • ์˜ˆ
    1
    
    git switch -c hotfix/payment-timeout main
    

5๏ธโƒฃ ํƒœ๊ทธ์™€ ํ•จ๊ป˜ ๋ฆด๋ฆฌ์ฆˆ ๊ด€๋ฆฌ

  • ๋ฐฐํฌ ์ค€๋น„๊ฐ€ ๋๋‚œ ๋ธŒ๋žœ์น˜(๋ณดํ†ต main์ด๋‚˜ release ๋ธŒ๋žœ์น˜)์—์„œ ํƒœ๊ทธ๋ฅผ ์ฐ์–ด ํ•ด๋‹น ์‹œ์ ์˜ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌ ๋ฐ ์ถ”์ 
  • ์˜ˆ
    1
    2
    
    git tag v1.2.0
    git push origin v1.2.0
    

ํšŒ์‚ฌ๋ณ„ Git ์ „๋žต

  • ์ž‘์€ ์Šคํƒ€ํŠธ์—…์€ GitHub flow(๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ โ†’ main์— PR ํ›„ ๋จธ์ง€)๋กœ ๋‹จ์ˆœํ•˜๊ฒŒ ๊ด€๋ฆฌ
  • ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋Š” Git flow(๋ฉ”์ธ/๊ฐœ๋ฐœ/๋ฆด๋ฆฌ์ฆˆ/ํ•ซํ”ฝ์Šค ๋ธŒ๋žœ์น˜ ์ฒด๊ณ„)๋ฅผ ์จ์„œ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜

๐Ÿš€ merge


  • Git ์—์„œ ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š”(๋ณ‘ํ•ฉํ•˜๋Š”) ๊ณผ์ •
  • ๊ฐœ๋ฐœ์ž๋“ค์€ ๋…๋ฆฝ์ ์ธ ์ž‘์—… ๊ณต๊ฐ„(๋ธŒ๋žœ์น˜)์—์„œ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๊ณ , ๋‚˜์ค‘์— ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค์„ ํ†ตํ•ฉํ•˜์—ฌ ๊ด€๋ฆฌ

๐Ÿš€ merge ์˜ ํ•„์š”์„ฑ


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

๐Ÿš€ merge ์˜ ์ž‘๋™ ๋ฐฉ์‹


1) Fast-forward merge

Fast-forward merge

  • ์กฐ๊ฑด: ๋Œ€์ƒ์ด ๋˜๋Š” ๋ธŒ๋žœ์น˜(์˜ˆ: main)์— ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์ด ์—†๊ณ , ํ•ฉ์น˜๋ ค๋Š” ๋ธŒ๋žœ์น˜(์˜ˆ: feature)๋งŒ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋•Œ ๋ฐœ์ƒ
  • ์ž‘๋™ ๋ฐฉ์‹: ๋Œ€์ƒ ๋ธŒ๋žœ์น˜์˜ HEAD๋ฅผ ํ•ฉ์น˜๋ ค๋Š” ๋ธŒ๋žœ์น˜์˜ HEAD๋กœ ์ด๋™
  • ์žฅ์ : ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€๋˜๊ณ , ๋ถˆํ•„์š”ํ•œ ์ปค๋ฐ‹์ด ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
  • ๋‹จ์ : feature ๋ธŒ๋žœ์น˜๊ฐ€ ์–ธ์ œ main ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ๋˜์—ˆ๋Š”์ง€ ๊ธฐ๋ก์ด ๋‚จ์ง€ ์•Š์•„ ์ถ”ํ›„ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์•…์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. (์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด git merge --no-ff ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ•์ œ๋กœ ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค)

2) Three-way merge

Three-way merge

  • ์กฐ๊ฑด: ๋Œ€์ƒ ๋ธŒ๋žœ์น˜(main)์™€ ํ•ฉ์น˜๋ ค๋Š” ๋ธŒ๋žœ์น˜(feature) ๋ชจ๋‘์—์„œ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์ด ๋ฐœ์ƒํ•˜์—ฌ, ๋‘ ๋ธŒ๋žœ์น˜์˜ ๊ณตํ†ต ์กฐ์ƒ ์ปค๋ฐ‹(base commit) ์ดํ›„๋กœ ๊ฐ๊ฐ์˜ ๋ณ€๊ฒฝ ์ด๋ ฅ์ด ์žˆ์„ ๋•Œ ๋ฐœ์ƒ
  • ์ž‘๋™ ๋ฐฉ์‹: ์•„๋ž˜ 3๊ฐ€์ง€ ์ปค๋ฐ‹์„ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ•ฉ์นœ๋‹ค. ์ถฉ๋Œ์ด ์—†๋‹ค๋ฉด Git์ด ์ž๋™์œผ๋กœ ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•˜๊ณ  ๋ณ‘ํ•ฉ์„ ์™„๋ฃŒํ•œ๋‹ค.
    • main ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ปค๋ฐ‹
    • feature ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ปค๋ฐ‹
    • ๋‘ ๋ธŒ๋žœ์น˜์˜ ๊ฐ€์žฅ ์ตœ๊ทผ ๊ณตํ†ต ์กฐ์ƒ ์ปค๋ฐ‹ (base commit)
  • ์žฅ์ : ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์ด ์ƒ์„ฑ๋˜์–ด ๋ช…ํ™•ํ•œ ๊ธฐ๋ก์ด ๋‚จ๊ธฐ ๋•Œ๋ฌธ์— ํžˆ์Šคํ† ๋ฆฌ ๋ณด์กด์— ์šฉ์ดํ•จ
  • ๋‹จ์ : ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ์ˆ˜๋™์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•จ

๐Ÿš€ merge ์‚ฌ์šฉ๋ฒ•


1
2
3
4
5
# 1. ๋ณ‘ํ•ฉํ•˜๋ ค๋Š” ๋Œ€์ƒ ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: main ๋ธŒ๋žœ์น˜์— feature ๋ธŒ๋žœ์น˜๋ฅผ ๋ณ‘ํ•ฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ)
git switch main

# 2. ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜(feature)๋ฅผ ํ˜„์žฌ ๋ธŒ๋žœ์น˜(main)์— ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
git merge feature

๐Ÿš€ ๋ณ‘ํ•ฉ ์ถฉ๋Œ (Merge Conflicts) ํ•ด๊ฒฐ


  1. ์ถฉ๋Œ ํ™•์ธ
    git merge ๋ช…๋ น ์‹คํ–‰ ํ›„ โ€œCONFLICTโ€ ๋ฉ”์„ธ์ง€๊ฐ€ ๋œจ๊ณ , git status ๋ช…๋ น์„ ํ†ตํ•ด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ํŒŒ์ผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ํŒŒ์ผ ์ˆ˜์ •
    ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ํŒŒ์ผ์„ ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ๋กœ ์—ด๋ฉด Git์ด ์ถฉ๋Œ ๋ถ€๋ถ„์„ ํŠน์ˆ˜ ๋งˆ์ปค(<<<<<<<, =======, >>>>>>>)๋กœ ํ‘œ์‹œํ•ด์ค€๋‹ค. ์ด ๋งˆ์ปค๋ฅผ ๋ณด๊ณ  ์›ํ•˜๋Š” ๋‚ด์šฉ์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์กฐํ•ฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ์ˆ˜์ •ํ•œ๋‹ค.
    1
    2
    3
    4
    5
    
     <<<<<<< HEAD
     ํ˜„์žฌ ๋ธŒ๋žœ์น˜์˜ ๋‚ด์šฉ
     =======
     ๋ณ‘ํ•ฉํ•˜๋ ค๋Š” ๋ธŒ๋žœ์น˜์˜ ๋‚ด์šฉ
     >>>>>>> feature
    
  3. ์ˆ˜์ •๋œ ํŒŒ์ผ ์Šคํ…Œ์ด์ง•
    ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•œ ํ›„, ์ˆ˜์ •๋œ ํŒŒ์ผ์„ git add <ํŒŒ์ผ ์ด๋ฆ„> ๋ช…๋ น์œผ๋กœ ์Šคํ…Œ์ด์ง• ์˜์—ญ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  4. ๋ณ‘ํ•ฉ ์ปค๋ฐ‹ ์ƒ์„ฑ
    ๋ชจ๋“  ์ถฉ๋Œ์ด ํ•ด๊ฒฐ๋˜๊ณ  ํŒŒ์ผ์ด ์Šคํ…Œ์ด์ง• ๋˜๋ฉด, git commit ๋ช…๋ น์œผ๋กœ ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•˜์—ฌ ๋ณ‘ํ•ฉ์„ ์™„๋ฃŒํ•œ๋‹ค. ์ด๋•Œ Git์€ ์ž๋™์œผ๋กœ ๋ณ‘ํ•ฉ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

ยฉ Hoon. Some rights reserved.