Git branch merge ๋ฐฉ๋ฒ•๋“ค ์•Œ์•„๋ณด๊ธฐ

2025. 8. 9. 00:35ใ†ํ˜‘์—…/Git

๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

1. Git ๋ธŒ๋žœ์น˜ ๋จธ์ง€ ์ „๋žต

2. ์ „๋žต1 : Merge Commit

3. ์ „๋žต2 : Squash and Merge

4. ์ „๋žต3 : Rebase and Merge

5. Rebase + Squash๋กœ ์ปค๋ฐ‹ ๊ธฐ๋ก ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ธฐ


1. Git ๋ธŒ๋žœ์น˜ ๋จธ์ง€ ์ „๋žต

Git์—์„œ ๋‘ ๊ฐœ์˜ ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š” ์ž‘์—…์„ merge๋ผ๊ณ  ํ•œ๋‹ค.

๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜๊ฐ€ ๋‹ค๊ฐ™์ด ๊ณต์œ ํ•˜๋Š” ๋ฉ”์ธ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ , ๊ฐœ๋ฐœ ์ž‘์—…์„ ํ•  ๋•Œ๋Š” ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ๋ธŒ๋žœ์น˜๋ฅผ ๋ฝ‘์•„๋‚ด์„œ ์ง„ํ–‰ํ•œ๋‹ค.

 

๋ธŒ๋žœ์น˜๋“ค์„ ๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•  ๋•Œ์˜ ์ „๋žต์ด ๋ช‡๊ฐ€์ง€ ์žˆ๋‹ค.

  • Merge Commit
    ๋ชจ๋“  ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ณด์กดํ•˜๋ฉฐ ๋ณ‘ํ•ฉ
  • Squash and Merge
    ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์„ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์œผ๋กœ ์••์ถ•ํ•˜์—ฌ ๋ณ‘ํ•ฉ
  • Rebase and Merge
    ์ปค๋ฐ‹๋“ค์„ ๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜ ์œ„๋กœ ์žฌ๋ฐฐ์น˜ํ•˜์—ฌ ์„ ํ˜•์œผ๋กœ ๋ณ‘ํ•ฉ

Github์—์„œ PR์„ ์˜ฌ๋ฆฐ ํ›„, ๋ณ‘ํ•ฉํ•  ๋•Œ ๋จธ์ง€ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚ด๊ฐ€ ํ•˜๋Š” ํ”Œ์ ์—์„œ๋Š” Rebase and merge ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ•˜์—ฌ ํ•˜๊ณ  ์žˆ๋‹ค.

 


2. ์ „๋žต1 : Merge Commit

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.

  • ๋‘ ๋ธŒ๋žœ์น˜์˜ ๋ชจ๋“  ์ปค๋ฐ‹ ๊ธฐ๋ก์„ ํฌํ•จํ•œ๋‹ค.
  • ๋ณ‘ํ•ฉํ•  ๋•Œ ์ƒˆ๋กœ์šด merge commit์ด ์ƒ์„ฑ๋œ๋‹ค.
  • ๋ธŒ๋žœ์น˜์˜ ์ „์ฒด ๊ฐœ๋ฐœ ๊ณผ์ •๊ณผ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์ถ”์ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค.

๊ธฐ๋ณธ ๋จธ์ง€๋Š” ๋˜ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‚˜๋ˆ ์ง„๋‹ค.

  1. Merge (Fast-Forward)
  2. Merge (Recursive) ← ๋” ์ผ๋ฐ˜์ ์ž„

1. Merge (Fast-Forward)

์ž‘์—… ๋ธŒ๋žœ์น˜์—์„œ (๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์—†๋Š”) ๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜๋กœ ๊ทธ๋Œ€๋กœ ์‹ธ์•… ์˜ฎ๊ฒจ ๋ถ™์ด๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

์ด ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๋ ค๋ฉด ๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜๋กœ๋ถ€ํ„ฐ ์ž‘์—… ๋ธŒ๋žœ์น˜๋ฅผ ๋‚ด๊ณ , ์ดํ›„์— ๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์—†์–ด์•ผ ํ•œ๋‹ค.

์‚ฌ์‹ค ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

 

์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ์  ํ•˜๋‚˜ = ์ปค๋ฐ‹ ๊ธฐ๋ก ํ•˜๋‚˜์ด๋‹ค.

 

2. Merge (Recursive)

์ด๊ฒŒ ์ผ๋ฐ˜์ ์ธ ๋จธ์ง€ ๋ฐฉ์‹์œผ๋กœ, ๋ฒ ์ด์Šค์—์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์–ด๋„ ๋จธ์ง€๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž‘์—… ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…์„ ํ•˜๋‹ค๊ฐ€ ๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜์˜ ๋๋ถ€๋ถ„์œผ๋กœ merge commit์„ ์ƒ์„ฑํ•˜๋ฉฐ ๋ณ‘ํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋ชจ๋“  ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ณด์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ ์ด์Šค๊ฐ€ ๋งŽ์ด ๋šฑ๋šฑํ•ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.

https://leetrue.hashnode.dev/branch-merge-strategy

 

https://leetrue.hashnode.dev/branch-merge-strategy

๋‚ด๊ฐ€ ๊ฐ€์ง„ merge commit์ด ์—†์–ด์„œ ๋ˆ„๊ตฐ๊ฐ€์˜ ๊ฒƒ์„ ์˜ˆ์‹œ๋กœ ๊ฐ€์ ธ์™€๋ดค๋‹ค.

 

ํŒŒ๋ž€์ƒ‰ : ๋ฒ ์ด์Šค(main) ๋ธŒ๋žœ์น˜

๋‚˜๋จธ์ง€ : ์ž‘์—… ๋ธŒ๋žœ์น˜

 

์ž‘์—… ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜์—์„œ ๋‚˜์™”๋‹ค๊ฐ€,

๋ณ‘ํ•ฉํ•  ๋•Œ ๋‹ค์‹œ ๋“ค์–ด๊ฐ€๋Š”๋ฐ ๊ทธ ๋•Œ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด merge commit์ด๋‹ค.

 

๋ชจ๋“  ์ปค๋ฐ‹ ๊ธฐ๋ก๋“ค์ด ๊ธฐ๋ก๋˜๋ฉด์„œ๋„ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์ข€ ์ง€์ €๋ถ„ํ•ด๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

merge ๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

git checkout main
git merge feature/branch

3. ์ „๋žต2 : Squash and Merge

์ž‘์—… ๋ธŒ๋žœ์น˜์—์„œ ์ƒ๊ธด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปค๋ฐ‹์„ ํ•ฉ์ณ์„œ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์„ ๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜์— ์ถ”๊ฐ€ํ•œ๋‹ค.

merge commit๊ณผ ๋‹ค๋ฅด๊ฒŒ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๋šฑ๋šฑํ•ด์ง€์ง€ ์•Š๋Š”๋‹ค.

 

์ž‘์—… ๋ธŒ๋žœ์น˜์—์„œ ์ƒ์„ฑํ–ˆ๋˜ ์ปค๋ฐ‹ ๊ธฐ๋ก๋“ค์ด ์—†์–ด์ง€๊ณ  squash merge๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ์ž…๋ ฅํ•˜๋Š” ์ปค๋ฐ‹๋ฉ”์„ธ์ง€๋งŒ ๋‚จ๊ฒŒ๋œ๋‹ค.
์ž‘์—…์— ๋Œ€ํ•œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋”ฐ๋กœ ๊ธฐ๋กํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ๋•Œ ์ปค๋ฐ‹ ๋ฐ”๋””๋กœ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค.

 

 

๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

git checkout main
git merge --squash feature/branch
git commit -m "์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€ ์ž…๋ ฅ"

 


4. ์ „๋žต3 : Rebase and Merge

๋ง ๊ทธ๋Œ€๋กœ base๋ฅผ ์žฌ์„ค์ •ํ•˜๋Š” ๋จธ์ง€๋ผ๋Š” ๋œป์ด๋‹ค.

๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ฒจ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹๋“ค์ด ์ถ”๊ฐ€๋˜์—ˆ์„ ๊ฒฝ์šฐ,

๋ณ‘ํ•ฉํ•  ๋•Œ ์ž‘์—… ๋ธŒ๋žœ์น˜๋ฅผ ๋ฝ‘์€ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์ตœ์‹  ์œ„์น˜๋ฅผ base๋กœ ํ•˜์—ฌ ์ž‘์—… ์ปค๋ฐ‹๋“ค์„ ์‚ด๋ ค ๋ณ‘ํ•ฉํ•œ๋‹ค.(์ด ๊ณผ์ •์—์„œ ์ปค๋ฐ‹์˜ ํ•ด์‹œ๊ฐ’์ด ๋ฐ”๋€๋‹ค)

 

์ด๊ฑด ๋‚ด git graph๋ฅผ ์˜ˆ์‹œ๋กœ ๋ณด์ž.

 

 

์˜ˆ์‹œ ์‚ฌ์ง„์„ ๋ณด๋ฉด ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์ƒ๋‹นํžˆ ๋šฑ๋ ํ•œ๋ฐ,

์ด๊ฑด ์•„์ง pr๋งŒ ์˜ฌ๋ผ๊ฐ€๊ณ  ๋จธ์ง€๊ฐ€ ์•ˆ๋œ ๋ธŒ๋žœ์น˜๋“ค์ด๋‹ค.

๋จธ์ง€ํ•˜๋ฉด ์„ ํ˜•์œผ๋กœ ๋‚ ์”ฌํ•ด์ง„๋‹ค.

 

main ๋ธŒ๋žœ์น˜๋กœ๋ถ€ํ„ฐ ์ž‘์—… ๋ธŒ๋žœ์น˜๋ฅผ ๋ฝ‘๊ณ ,

๋จธ์ง€ํ•˜๋ฉด ๊ทธ๋Œ€๋กœ main ๋ธŒ๋žœ์น˜์—์„œ ์ปค๋ฐ‹์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

 

 

 

 

 

 

 

 

๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

git checkout feature/branch
git rebase main
# ์ถฉ๋Œ ํ•ด๊ฒฐ
git add .
git rebase --continue

 


5. Rebase + Squash๋กœ ์ปค๋ฐ‹ ๊ธฐ๋ก ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ธฐ

rebase์™€ squash๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•ด์„œ ์ปค๋ฐ‹ ๊ธฐ๋ก์„ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž‘์—… ๋ธŒ๋žœ์น˜์—์„œ squash๋กœ ์ปค๋ฐ‹ ๊ธฐ๋ก์„ ์ •๋ฆฌํ•˜๊ณ 

๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜๋กœ ํ•ฉ์น  ๋•Œ rebase๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ชฉ์  squash๋งŒ rebase + squash
๋ณ‘ํ•ฉ ์‹œ ์ปค๋ฐ‹ 1๊ฐœ๋กœ ์••์ถ• โœ… ๊ฐ€๋Šฅ (merge --squash) โœ… ๊ฐ€๋Šฅ
๋ถˆํ•„์š”ํ•œ ์ปค๋ฐ‹ ์ •๋ฆฌ โŒ ๋ชปํ•จ (์ปค๋ฐ‹ ๋‚ด์šฉ ์ˆ˜์ • ๋ถˆ๊ฐ€) โœ… ๊ฐ€๋Šฅ
์ปค๋ฐ‹ ์ˆœ์„œ ๋ณ€๊ฒฝ/์ˆ˜์ • โŒ ๋ชปํ•จ โœ… ๊ฐ€๋Šฅ
์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๋ณ‘ํ•ฉ/ํŽธ์ง‘ โœ… GitHub UI์—์„œ ์ž๋™ โœ… CLI์—์„œ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์กฐ์ • ๊ฐ€๋Šฅ
์ž‘์—… ๋ธŒ๋žœ์น˜ ์ž์ฒด๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ โŒ ์•ˆ ๋จ โœ… ๋จ

 

 

์ž‘์—… ์ค‘ ๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ฒผ์„ ๊ฒฝ์šฐ,

# ์ž‘์—… ๋ธŒ๋žœ์น˜: feat/button
# ๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜: main

git checkout feat/button
git fetch origin
git rebase origin/main
# .... ์ถฉ๋Œ ํ•ด๊ฒฐ ....

git add .
git rebase --continue

๋ฉ”์ธ์„ fetch, rebase ํ•˜๋ฉด ๋œ๋‹ค.

 

 

์ด๋ฏธ ์˜ฌ๋ฆฐ PR์— ์ตœ์‹  ๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜๋ฅผ ๋ฐ˜์˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ

git checkout feat/button
git fetch origin
git rebase -i origin/main

#vim์—์„œ squash, pick ์ง„ํ–‰
pick a1b2c3 add button ui
squash a2b3c4 fix typo
reword a3c4b5 final

git push -f

์ด๋Ÿด๋• ์ปค๋ฐ‹ ํ•ด์‹œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ ๊ผญ pushํ•  ๋•Œ -f(--force)๋ฅผ ํ•จ๊ป˜ ํ•ด์•ผํ•œ๋‹ค.

 

 

 

์ฐธ๊ณ 

๋”๋ณด๊ธฐ
๋ฐ˜์‘ํ˜•