๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Front-End/Git&Github

[Git] Merge ๊ฐœ๋… (Merge, Fast-Forward, Three-Way, Rebase / Squash & Merge)

by Sun A 2024. 9. 23.

ํ•™์Šต ๊ณ„๊ธฐ

git์œผ๋กœ ํ˜‘์—…ํ•  ๋•Œ ๋ธŒ๋žœ์น˜๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค์–‘ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ด๋ฒˆ์— ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ค ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ๋Š” ์ง€ ์•Œ์•„๋ณด๊ณ , ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•œ squash& Merge ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ธฐ๋กํ•˜๊ณ ์ž ํ•œ๋‹ค.

* ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜์ด ์ ์€ ์‚ฌ๋žŒ์ด ์ž‘์„ฑํ•œ ๊ธ€์ด๋ฏ€๋กœ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค  

 

Merge

์˜์–ด ๋‹จ์–ด ๋œป์œผ๋กœ๋Š” "๋ณ‘ํ•ฉํ•˜๋‹ค"๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Merge๋Š” Git์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ†ตํ•ฉํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•œ๋‹ค. 

ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ๋„์ž…๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ ํ•œ ์‚ฌ๋žŒ์ด ๋ชจ๋‘ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋‹ค. 

ํ˜‘์—…์œผ๋กœ ์ง„ํ–‰ํ•  ๋•Œ ๋™์‹œ์— ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋Š”๋ฐ ๊ฐ ์ž‘์—…์€ ๋…๋ฆฝ๋œ ๋ธŒ๋žœ์น˜์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  Pull Request ๋ฅผ ๋ณด๋‚ธ ํ›„ ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด ์ˆ˜์ •์„ ๊ฑฐ์น˜๊ณ  ๋‚˜๋ฉด ์ตœ์ข… ๋ณ‘ํ•ฉ ์ž‘์—…, Merge๋ฅผ ๊ฑฐ์น˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ ์žˆ๋‹ค. 

์ด Merge๋„ ๋ณ‘ํ•ฉ ๋ฐฉ๋ฒ•์ด ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

1. Fast-foward Merge

์กฐ๊ฑด : ๋ธŒ๋žœ์น˜ ๊ฐ„์˜ ์ž‘์—…์ด ์„ ํ˜•์ ์ธ ๊ฒฝ์šฐ (= ํ•œ ๋ธŒ๋žœ์น˜์—์„œ๋งŒ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚œ ๊ฒฝ์šฐ)

  • ๋ธŒ๋žœ์น˜์˜ ํฌ์ธํ„ฐ๋ฅผ ๋‹จ์ˆœํžˆ ๋ณ‘ํ•ฉ ๋Œ€์ƒ ๋ธŒ๋žœ์น˜์˜ ๋์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค. 

์‹ค์ œ ํ”„๋กœ์ ํŠธ ๋ธŒ๋žœ์น˜ ๊ทธ๋ž˜ํ”„

ํ•‘ํฌ์ƒ‰์ด ๋‚ด๊ฐ€ ๋งŒ๋“  ๋ธŒ๋žœ์น˜์ด๋‹ค. ์ด ๋ธŒ๋žœ์น˜๋ฅผ main ๋ธŒ๋žœ์น˜์— merge ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•์ด 1๋ฒˆ์˜ Fast-forward Merge ๋ฐฉ๋ฒ•์ด๋‹ค.

์‹ค์ œ๋กœ ํ„ฐ๋ฏธ๋„์— ๊ทธ๋ ‡๊ฒŒ ๋–ด์—ˆ๋Š”๋ฐ ๋ฌด์Šจ ์˜๋ฏธ์ธ์ง€ ๋ชฐ๋ž์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ๋Š” A๊ฐ€ ๋ธŒ๋žœ์น˜์˜ ํฌ์ธํ„ฐ์ด๋ฉฐ B๊ฐ€ ๋ณ‘ํ•ฉ ๋Œ€์ƒ ๋ธŒ๋žœ์น˜์˜ ๋์— ํ•ด๋‹นํ•œ๋‹ค.

Fast-Forward Merge ๋ฐฉ์‹

 

2.  Three-way Merge

์กฐ๊ฑด : ๋‘ ๋ธŒ๋žœ์น˜์—์„œ ๊ฐ๊ฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ 

  • ๋‘ ๋ธŒ๋žœ์น˜์˜ ๊ณตํ†ต ์กฐ์ƒ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ๊ฐ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ•ฉ์นœ ์ƒˆ๋กœ์šด ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์ด ์ƒ์„ฑ๋œ๋‹ค.

1๋ฒˆ์˜ ์‚ฌ์ง„ ์ƒํ™ฉ์— ๋”ฐ๋ฅด๋ฉด, A์™€ B ๋ธŒ๋žœ์น˜ ๋ชจ๋‘์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ผ์–ด๋‚˜์„œ ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ด๋Ÿด ๋•Œ๋Š” ๋ณ‘ํ•ฉ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.

3-way Merge ๋ฐฉ์‹

 

 

1, 2์˜ Merge ์ž‘์—… Git์—์„œ ์ž…๋ ฅํ•˜๊ธฐ

๋‚˜๋Š” ์•„์ง ์ดˆ๋ณด๋ผ์„œ SourceTree ๋ผ๋Š” UI ํˆด์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ (Github desktop๋„ ์žˆ๊ณ  Fork๋„ ์žˆ๋‹ค.) ๋ช…๋ น์–ด๋กœ ํ•˜๋Š” ๊ฒŒ ํ›จ์”ฌ ๋น ๋ฅผ ๊ฒƒ ๊ฐ™๊ธด ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ์šฐ์„  UI ํˆด์„ ์‚ฌ์šฉ์ค‘์ด๋‹ค. 

git checkout main
git merge [์ž‘์—…ํ•œ ๋ธŒ๋žœ์น˜๋ช…]

checkout์„ ์ž…๋ ฅํ•˜์—ฌ main ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•œ ํ›„ merge ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•ด์„ํ•˜๋ฉด ๋œ๋‹ค.

 

[์ถ”๊ฐ€]

Rebase Merge

์„ค๋ช… : Rebase๋Š” ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๋Œ€์‹ , ๊ธฐ์กด ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹์„ ๊ฐ€์ ธ์™€์„œ ํ˜„์žฌ ๋ธŒ๋žœ์น˜์˜ ๊ฐ€์žฅ ์ตœ์‹  ์ปค๋ฐ‹ ๋’ค์— ์ด์–ด๋ถ™์ด๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ  ์ปค๋ฐ‹ ์ด๋ ฅ์ด ๊น”๋”ํ•˜๊ฒŒ ์ด์–ด์ง€๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค.

์žฅ์  : ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๋งค์šฐ ๊น”๋”ํ•จ

๋‹จ์  : Rebase ์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๊ฒฐ์ด ๋ณต์žกํ•จ / ํ˜‘์—… ์ค‘์—๋Š” ์›๋ณธ ์ด๋ ฅ์„ ๋ฎ์–ด์“ฐ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•จ

  • ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด ๋ธŒ๋žœ์น˜ ๊ฐ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๋Œ€์‹ , ๋‹ค์‹œ ๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜ ์œ„์— ์žฌ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค. 

์ถœ์ฒ˜ : hudi.blog

[์‚ฌ์šฉ ๋ฐฉ๋ฒ•]

git checkout [๋ธŒ๋žœ์น˜๋ช…]
git rebase main
  • ์—ฌ๊ธฐ์„œ ์ถ”๊ฐ€๋กœ, rebase๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณธ์ธ์ด ์ž‘์—…ํ•œ ์ปค๋ฐ‹์ด main ๋ธŒ๋žœ์น˜์— ํฌํ•จ๋˜๋Š” ๊ฒƒ์„ ํ˜‘์—…์—์„œ ์›ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿด๋•Œ๋Š” ํŠน์ • ์ปค๋ฐ‹์„ ์ œ์™ธํ•˜๊ฑฐ๋‚˜ ์„ ํƒ์ ์œผ๋กœ ์ปค๋ฐ‹์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

Merge Confilct (๋ณ‘ํ•ฉ ์ถฉ๋Œ)

์ด ๋ณ‘ํ•ฉ ์ถฉ๋Œ์€ ๋‘ ๋ธŒ๋žœ์น˜์—์„œ ๋™์ผํ•œ ํŒŒ์ผ์ด๋‚˜ ์ฝ”๋“œ์˜ ๊ฐ™์€ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ถฉ๋Œ์ด๋‹ค. 

Git์€ ์ž๋™์œผ๋กœ ๋ณ‘ํ•ฉํ•˜์ง€ ๋ชปํ•˜๊ณ  ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ๋ถ€๋ถ„์„ ์•Œ๋ ค์ฃผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ํ•ด๋‹น ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•œ ํ›„ Mergeํ•œ๋‹ค.

์ถฉ๋Œ ํ•ด๊ฒฐ ํ›„ ๋ณ‘ํ•ฉ ์ฝ”๋“œ

git add [์ถฉ๋Œ ํ•ด๊ฒฐ๋œ ํŒŒ์ผ]
git commit

๊ทธ๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ Merge์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์œผ๋‹ˆ ์ด์ œ Squash & Merge์™€ Rebast & Merge ๋ฐฉ์‹์„ ์•Œ์•„๋ณด์ž

Squash & Merge

Squash์˜ ๋œป์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปค๋ฐ‹์„ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์œผ๋กœ ํ•ฉ์น˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š”๋ฐ ์˜์–ด ๋‹จ์–ด ๋œป ๊ทธ๋Œ€๋กœ main ๋ธŒ๋žœ์น˜์— Merge ํ•  ์‹œ, ์ด์ „์— ์ž‘์—…ํ•œ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹์€ ํ•ฉ์ณ์ง€๋ฉด์„œ ์‚ญ์ œ๋œ๋‹ค. 

  • ํŠน์ง• : ๋ณ‘ํ•ฉํ•  ๋•Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปค๋ฐ‹์„ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์œผ๋กœ ๋ฌถ์–ด ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ฐ˜์˜
  • ์‚ฌ์šฉ ์ด์œ  : ์„ธ๋ถ€์ ์ธ ์ปค๋ฐ‹ ์ด๋ ฅ์„ ๋‚จ๊ธฐ๊ธฐ ๋ณด๋‹ค๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์ด ์™„์„ฑ๋œ ์ƒํƒœ์—์„œ ์ „์ฒด ์ž‘์—…์„ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์žฅ์  : ์ด๋ ฅ ๊ด€๋ฆฌ๊ฐ€ ๋” ๊น”๋”ํ•ด์ง„๋‹ค.

[์‚ฌ์šฉ๋ฐฉ๋ฒ•]

git checkout main 
git merge --squash [๋ธŒ๋žœ์น˜๋ช…]
git commit

ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ ๊ถ๊ธˆํ–ˆ๋˜ ์ ์€ squash ์ดํ›„์— commit์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

์•Œ์•„๋ณด๋‹ˆ squash ๋Š” ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ณ  ํ•ฉ์ณ์ง€๊ธฐ ์ „์˜ ์ปค๋ฐ‹์€ ์‚ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€ํ† ํ•  ๊ธฐํšŒ๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค.

ํ๋ฆ„

  •  main ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ → merge --squash ์‹คํ–‰ → commit ์ง„ํ–‰

- ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ณ‘ํ•ฉ๋œ ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•œ ํ›„ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•  ๊ธฐํšŒ๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

- ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ์˜๋ฏธ๋ฅผ ๋‹ด์€ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. (๊ณผ์ •์ด ๋ชจ๋‘ ๋‹ด๊ธด)

 

์ผ๋ฐ˜ git merge์™€ squash merge์˜ ์ฐจ์ด์ 

  • ์ผ๋ฐ˜ git merge ๋Š” ๋ณ‘ํ•ฉ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ฆ‰์‹œ ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•˜์ง€๋งŒ, squash merge๋Š” ๋ณ‘ํ•ฉ ํ›„์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ปค๋ฐ‹ํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด์žˆ๋‹ค.

์š”์•ฝ

๋ณ‘ํ•ฉ ๋ฐฉ์‹ ๋ณ‘ํ•ฉ ์ปค๋ฐ‹ ์ƒ์„ฑ ์—ฌ๋ถ€ ์ปค๋ฐ‹ ์ด๋ ฅ ๊ด€๋ฆฌ  ์ฃผ์š” ์‚ฌ์šฉ ์ƒํ™ฉ
Fast-forward X ๊ฐ„๋‹จ ์„ ํ˜•์ ์ธ ์ด๋ ฅ ์œ ์ง€
Three-way O ๋ช…ํ™• ๋‘ ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ๊ฐ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ
Squash X (ํ•˜์ง€๋งŒ ์••์ถ•ํ•œ ๋‹จ์ผ ์ปค๋ฐ‹์€ ์ƒ์„ฑํ•จ) ์••์ถ• ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ณ  ์‹ถ์„ ๋•Œ
Rebase X ๊น”๋” ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ•  ๋•Œ
  • Squash๋Š” ๋ณ‘ํ•ฉ์€ ์ง„ํ–‰ํ•˜์ง€๋งŒ ๊ทธ ๋ณ‘ํ•ฉ์— ๋Œ€ํ•œ ์ปค๋ฐ‹์€ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ๋ณ‘ํ•ฉ๋œ ๋‚ด์šฉ์„ ๋‹จ์ผ ์ปค๋ฐ‹์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๊ธฐ๋ก์„ ๋‹ค์‹œ ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ณ‘ํ•ฉ ์ปค๋ฐ‹ ์ƒ์„ฑ์€ ์•ˆํ•˜๊ธฐ ๋•Œ๋ฌธ์— X์ด๋‹ค.

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜

๋”๋ณด๊ธฐ