๐ŸŽ ๋‹ค์–‘ํ•œ git merge ๋ฐฉ๋ฒ• (3-way, fast-forward, squash, rebase)

์œ ์ง„ยท2025๋…„ 5์›” 18์ผ

git

๋ชฉ๋ก ๋ณด๊ธฐ
6/13

ํ‰์†Œ ํฌ์ŠคํŒ…์„ ์ž‘์„ฑํ•  ๋•Œ ๊ฐ•์˜๋ฅผ ํ•œ ๋ฒˆ ์ดํ•ดํ•˜๋ฉฐ ๋“ฃ๊ณ , ํ›„์— ๊ฐ•์˜๋ฅผ ๋‹ค์‹œ ๋“ค์œผ๋ฉฐ ๊ฒŒ์‹œ๊ธ€์„ ์“ฐ๋ฉด์„œ ์ •๋ฆฌํ•œ๋‹ค. ๊ทธ๋ƒฅ ๊ทธ๋ ‡๋‹ค๋Š” ๋ง์„ ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.

์–ด์จŒ๊ฑฐ๋‚˜ ์ด๋ฒˆ ๊ฐ•์˜๋Š” git์˜ ๋‹ค์–‘ํ•œ merge ๋ฐฉ๋ฒ•๊ณผ ๊ทธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ค€๋‹ค.

3-way merge

๋ธŒ๋žœ์น˜์— ๊ฐ๊ฐ ์‹ ๊ทœ ์ปค๋ฐ‹์ด ํ•˜๋‚˜ ์ด์ƒ ์žˆ์„ ๋•Œ git merge๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‘ ๋ธŒ๋žœ์น˜์˜ ์ฝ”๋“œ๋ฅผ ํ•ฉ์ณ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

์ด๋ฅผ 3-way merge๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, git merge์˜ ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์‹์ด๋‹ค.

fast-forward merge

์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜์—๋งŒ ์ปค๋ฐ‹์ด ์žˆ๊ณ , ๊ธฐ์ค€ ๋ธŒ๋žœ์น˜(main)์— ์‹ ๊ทœ ์ปค๋ฐ‹์ด ์—†์„ ๊ฒฝ์šฐ git merge๋ฅผ ์‹คํ–‰ํ•˜๋ฉด fast-forward merge๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋”ฑํžˆ ํ•ฉ์น ๊ฒŒ ์—†์–ด์„œ ๊ทธ๋ƒฅ ์‹ ๊ทœ๋ธŒ๋žœ์น˜ ๋ณด๊ณ  "์ง€๊ธˆ๋ถ€ํ„ฐ ๋‹ˆ ์ด๋ฆ„์€ main ๋ธŒ๋žœ์น˜์—ฌ"ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹์„ main ๋ธŒ๋žœ์น˜๋กœ ๊ทธ๋Œ€๋กœ ์ด๋™์‹œํ‚ค๋ฉฐ, ๋ณ„๋„์˜ merge ์ปค๋ฐ‹์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.

๋ฌผ๋ก  ์‹ซ์œผ๋ฉด git merge --no-ff ๋ธŒ๋žœ์น˜๋ช…์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ•์ œ๋กœ 3-way merge๋ฅผ ํ•˜๋ฉด ๋œ๋‹ค.

๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด

merge๋ฅผ ํ•˜๋”๋ผ๋„ ๋ธŒ๋žœ์น˜๋Š” ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ค˜์•ผ ํ•œ๋‹ค.

  • git branch -d ๋ธŒ๋žœ์น˜์ด๋ฆ„: ๋ณ‘ํ•ฉ ์™„๋ฃŒ๋œ ๋ธŒ๋žœ์น˜ ์‚ญ์ œ.
  • git branch -D ๋ธŒ๋žœ์น˜์ด๋ฆ„: ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์€(merge ์ „) ๋ธŒ๋žœ์น˜ ๊ฐ•์ œ ์‚ญ์ œ.

rebase and merge

rebase๋Š” ๋ธŒ๋žœ์น˜์˜ ์‹œ์ž‘์ ์„ ๋‹ค๋ฅธ ์ปค๋ฐ‹์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์ด๋‹ค.

rebase and merge ๋ฐฉ๋ฒ•

git switch ์ƒˆ๋กœ์šด๋ธŒ๋žœ์น˜
git rebase main
git switch main
git merge ์ƒˆ๋กœ์šด๋ธŒ๋žœ์น˜

rebase & merge๋ฅผ ํ•œ ์ค„๋กœ ์‰ฝ๊ฒŒ ๋น„์œ ํ•˜์ž๋ฉด "๊ฐ•์ œ fast-forward merge"๋‹ค.

rebase ์žฅ์ 

  • 3-way merge ๋Œ€์‹  ๊ฐ•์ œ๋กœ fast-forward๋ฅผ ์›ํ•  ๋•Œ.
  • ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์‹ถ์„ ๋•Œ.

rebase ๋‹จ์ 

  • ๋ธŒ๋žœ์น˜ ๊ฐ„ ์ฐจ์ด๊ฐ€ ํฌ๋ฉด ์ถฉ๋Œ์ด ๋งŽ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ํ•ด๊ฒฐ์ด ๋ฒˆ๊ฑฐ๋กญ๋‹ค.

squash and merge

์ดˆ๋ณด์ž๋“ค์€ ๊ทธ๋ƒฅ 3-way merge๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ๋Œ€์ถฉ ๋ชจ๋“  ๋ธŒ๋žœ์น˜๋ฅผ 3-way merge ํ•ด๋ฒ„๋ฆฌ๋ฉด ๋‚˜์ค‘์— ์ฐธ์‚ฌ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.
squash and merge๋Š” ๋ธŒ๋žœ์น˜์˜ ๋ชจ๋“  ์ปค๋ฐ‹์„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ main ๋ธŒ๋žœ์น˜์— ๋‹จ์ผ ์ปค๋ฐ‹์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • 3-way merge์ฒ˜๋Ÿผ ๋ณต์žกํ•œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๊ณ , ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ main์— ์ ์šฉํ•œ๋‹ค.
  • git log์—์„œ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š์•„ ๊น”๋”ํ•˜๋‹ค.

squash and merge ๋ฐฉ๋ฒ•

git switch main
git merge --squash ๋ธŒ๋žœ์น˜๋ช…
git commit -m '๋ฉ”์„ธ์ง€'

main ๋ธŒ๋žœ์น˜์˜ log๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์“ฐ๋ฉด ์ข‹๋‹ค.

์กฐ๊ธˆ ๋” ์ดํ•ด๋ฅผ ํ•จ๊ณผ ๋™์‹œ์— ์ต์ˆ™ํ•ด์ง€๊ธฐ ์œ„ํ•ด main branch์— commit3๋ฅผ ๋งŒ๋“ค๊ณ  another branch๋ฅผ ๋งŒ๋“ค์–ด commit2-1์„ ํ–ˆ๋‹ค.

์ด๋ฅผ squash and mergeํ•ด๋ณด๋ฉด

์ค‘๊ฐ„์— ์˜ค๋ฅ˜๊ฐ€ ๋œจ๊ธด ํ–ˆ๋Š”๋ฐ another์—์„œ commit๋œ ๊ฒฐ๊ณผ๊ฐ€ ์‚ญ์ œํ•ด๋„ ์ž˜ ๋“ค์–ด์˜จ ๊ฑธ ๋ณด๋‹ˆ ๋œ ๋“ฏ

๊ตฟ

์–ด๋–ค merge๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

  • ๊ทธ๋Ÿผ์—๋„ ์ดˆ๋ณด์ž๋Š” ๊ณ ๋ฏผ ์—†์ด ๊ธฐ๋ณธ 3-way merge๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ข‹๋‹ค. (์ถฉ๋Œ์€ ๋ฐฐ์› ์œผ๋‹ˆ ์•Œ์•„์„œ ํ•ด๊ฒฐํ•˜์ž)
  • ํ”„๋กœ์ ํŠธ์— ๋”ฐ๋ผ merge ๊ฐ€์ด๋“œ๋ผ์ธ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ํŒ€์˜ ๊ธฐ์ค€์„ ๋”ฐ๋ฅด๊ฑฐ๋‚˜ ์—†๋‹ค๋ฉด ๋„๋ง..์€ ์žฅ๋‚œ์ด๊ณ  ์Šค์Šค๋กœ์˜ ๊ธฐ์ค€์„ ์„ธ์šฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ˆ™์ œ๊ฐ€ ์žˆ๋‹ค

  1. ๋ธŒ๋žœ์น˜ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ์ปค๋ฐ‹ ํ›„ squash and merge ํ•ด๋ณด๊ธฐ.
  2. ๋ธŒ๋žœ์น˜ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ์ปค๋ฐ‹ ํ›„ rebase and merge ํ•ด๋ณด๊ธฐ.
  3. ๋ณ‘ํ•ฉ ์™„๋ฃŒ๋œ ๋ธŒ๋žœ์น˜ ์‚ญ์ œํ•ด๋ณด๊ธฐ.

๋”ฐ๋ผ๋งŒ ์น˜๊ฑฐ๋‚˜ ๋ณด๊ธฐ๋งŒ ํ•œ๋‹ค๊ณ  ์ดํ•ด๊ฐ€ ๋˜๋Š” ๊ฑด ์•„๋‹ˆ๋‹ˆ๊น ๋‹ค ํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค.
๋‚˜๋„ ํ•ด๋ด์•ผ์ง€

0๊ฐœ์˜ ๋Œ“๊ธ€