Git์˜ Rebase๋Š” ๋‹ค์–‘ํ•œ ์“ฐ์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ, ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ์‹œ Rebase๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ์ „๋žต

๋‘๊ฐœ์˜ ๋ธŒ๋žœ์น˜๊ฐ€ ์กด์žฌํ•˜๋Š” ์ƒํ™ฉ์ผ ๋•Œ, ํ•˜๋‚˜์˜ ๋ธŒ๋žœ์น˜์—์„œ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ํ•ฉ์น˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ Git์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. Merge
2. Rebase

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” Merge์— ๋น„ํ•ด Rebase๋Š” ์กฐ๊ธˆ ์ƒ์†Œํ•˜์‹  ๋ถ„๋“ค์ด ๋งŽ์„์ง€๋„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. Rebase๋ฅผ ์•Œ์•„๋ณด๊ธฐ์— ์•ž์„œ ๋จผ์ € ์šฐ๋ฆฌ์—๊ฒŒ ์ต์ˆ™ํ•œ Merge์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Merge

Merge ๋ธŒ๋žœ์น˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์€ ๊ฐ ๋ธŒ๋žœ์น˜์˜ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ๋‘ ๊ฐœ์™€ ๊ณตํ†ต ์กฐ์ƒ์˜ ์ด 3๊ฐœ์˜ ์ปค๋ฐ‹์„ ์ด์šฉํ•˜๋Š” 3-way merge๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€๋ น, ๋‹ค์Œ ๊ทธ๋ฆผ์—์„œ ๋ณด์ด๋Š” feature์™€ master์˜ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์€ ๊ฐ๊ฐ f2์™€ m2, ๊ทธ๋ฆฌ๊ณ  ๊ณตํ†ต ์กฐ์ƒ(base)์€ ์ปค๋ฐ‹ b์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ด ์„ธ ์ปค๋ฐ‹์œผ๋กœ ์ƒˆ ์ปค๋ฐ‹์„ ๋งŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (๋ผ์ž„์ด ๊ธฐ๊ฐ€๋ง‰ํžˆ์ฃ )

git-branches.png

๊ทธ๋ ‡๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ 3-way merge๋Š” ์ •ํ™•ํžˆ ์–ด๋–ค ๊ณผ์ •์ผ๊นŒ์š”? ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ๋‘๊ฐœ๋งŒ ๋น„๊ตํ•ด์„œ 2-way merge๋ฅผ ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฑธ๊นŒ์š”?

3-way-merge

๋น„๊ต๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ 3๊ฐœ์˜ ์ปค๋ฐ‹์„ ๋‹ค์‹œ ์ •๋ฆฌํ•˜๋ฉด ํ•„์š”ํ•œ ๊ฒƒ์€ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์ปค๋ฐ‹์ž…๋‹ˆ๋‹ค.

1. ๋‚ด ๋ธŒ๋žœ์น˜ ์ปค๋ฐ‹
2. ๋‚จ์˜ ๋ธŒ๋žœ์น˜ ์ปค๋ฐ‹
3. ๋‘ ๋ธŒ๋žœ์น˜์˜ ๊ณตํ†ต ์กฐ์ƒ์ด ๋˜๋Š” ์ปค๋ฐ‹

์ด์ œ 3-way merge๊ฐ€ ํšจ์œจ์ ์ธ ์ด์œ ๋ฅผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ์„ , ๊ณตํ†ต ์กฐ์ƒ์ด ๋˜๋Š” Base์— ์ปค๋ฐ‹๋˜์–ด ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์ด a, b, c, d๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋‹ค์Œ ํ‘œ์— ๊ธฐ๋กํ•ด ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.

image.png

๋‚ด ๋ธŒ๋žœ์น˜(My)์™€ ๋‚จ์˜ ๋ธŒ๋žœ์น˜(Other)์—์„œ ๋ณ€๊ฒฝ๋œ ๋‚ด์—ญ์€ ๊ฐ๊ฐ ์•„๋ž˜์˜ ํ‘œ์— ์ ํžŒ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

image.png

์ฒซ ๋ฒˆ์งธ a ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‚ด ๋ธŒ๋žœ์น˜์—์„œ๋Š” a๋ถ€๋ถ„์— ๋Œ€ํ•ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์ด ๊ทธ๋Œ€๋กœ a์ด๋ฉฐ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์€ a'๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ b์—์„œ๋Š” ์–‘์ชฝ ๋‹ค ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ, c๋Š” ๋‘˜ ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ๋‚ด์šฉ์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ d ๋ถ€๋ถ„์€ ๋‚ด ์ชฝ์—์„œ๋งŒ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ, Base๊ฐ€ ๋˜๋Š” ๊ณตํ†ต ์กฐ์ƒ ์ปค๋ฐ‹์ด ์—†๊ณ  ๋‚˜์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ธŒ๋žœ์น˜๋งŒ ๋น„๊ตํ•˜์—ฌ Merge๋ฅผ ํ•œ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค.

image.png

์–‘์ชฝ์—์„œ ๋™์ผํ•˜๊ฒŒ ๊ด€์ฐฐ๋˜๋Š” b ๋ถ€๋ถ„์„ ์ œ์™ธํ•˜๊ณ ๋Š” a๊ฐ€ ์›๋ž˜๋Š” a์˜€๋Š”์ง€ a'์˜€๋Š”์ง€ ํ™•์‹คํ•˜๊ฒŒ ์ •ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ถฉ๋Œ์ด ๋‚œ ๊ฒƒ์ธ์ง€์˜ ์—ฌ๋ถ€๋„ ์•Œ ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒƒ์ด์ฃ .

ํ•˜์ง€๋งŒ Base ์ปค๋ฐ‹์„ ํ•จ๊ป˜ ๋น„๊ตํ•˜์—ฌ 3-way merge๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋‹ค์Œ ํ‘œ์™€ ๊ฐ™์ด Merge ์ปค๋ฐ‹์˜ ์ƒํƒœ๋ฅผ ๋ณด๋‹ค ๋ช…ํ™•ํ•˜๊ฒŒ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

image.png

๋‹ค์‹œ ์ •๋ฆฌํ•˜๋ฉด, git์€ Merge๋ฅผ ํ•  ๋•Œ ๊ฐ ๋ธŒ๋žœ์น˜์˜ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ๋‘ ๊ฐœ, ๋ธŒ๋žœ์น˜์˜ ๊ณตํ†ต ์กฐ์ƒ ์ปค๋ฐ‹ ์ด 3๊ฐœ์˜ ์ปค๋ฐ‹์„ ๋น„๊ตํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ๋งŒ๋“ค์–ด ๋ณ‘ํ•ฉ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Rebase

๋‘ ๋ธŒ๋žœ์น˜๋ฅผ ํ•ฉ์น˜๋Š” ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ธ Rebase๋Š” Merge์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๋ธŒ๋žœ์น˜์˜ ๊ณตํ†ต ์กฐ์ƒ์ด ๋˜๋Š” base๋ฅผ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹ ์ง€์ ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ธŒ๋žœ์น˜์˜ ๊ทธ๋ฆผ์„ ๋‹ค์‹œ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
git-branches.png

์šฐ๋ฆฌ๊ฐ€ rebase๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์–ป๊ณ ์ž ํ•˜๋Š” ๋ชฉ์ ์€ master ๋ธŒ๋žœ์น˜์˜ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์ธ m2 ์ดํ›„์— feature ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ธ f1๊ณผ f2๊ฐ€ ์ผ์–ด๋‚œ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๋ชจ์–‘์œผ๋กœ์š”!
image.png

์ฆ‰, feature์˜ base๋ฅผ b๊ฐ€ ์•„๋‹ˆ๋ผ m2๋กœ ์žฌ์„ค์ •(Rebase)ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

image.png

Rebase์˜ ๊ธฐ๋ณธ ์ „๋žต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋จผ์ € Rebase ํ•˜๋ ค๋Š” ๋ธŒ๋žœ์น˜ ์ปค๋ฐ‹๋“ค์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ Patch๋ผ๋Š” ๊ฒƒ์œผ๋กœ ๋งŒ๋“  ๋‹ค์Œ์— ์–ด๋”˜๊ฐ€์— ์ €์žฅํ•ด ๋‘ก๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ master ๋ธŒ๋žœ์น˜์— ํ•˜๋‚˜์”ฉ ์ ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

feature๋ฅผ master ๋ธŒ๋žœ์น˜๋กœ Rebaseํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ผ๋ จ์˜ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ๋‘ ๋ธŒ๋žœ์น˜์˜ ๋ณ‘ํ•ฉ์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

1. feature ๋ธŒ๋žœ์น˜๋กœ checkout
2. master ๋ธŒ๋žœ์น˜๋กœ rebase
3. feature ๋ธŒ๋žœ์น˜๋ฅผ master๋กœ fast-forward merge

image.png

Rebase๋ฅผ ํ•˜๋Š”๋ฐ ์™œ Merge๊ฐ€ ๋‚˜์˜ฌ๊นŒ์š”? fast-forward merge์— ๋Œ€ํ•ด์„œ๋Š” ์ด ์˜์ƒ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ด์ œ rebase ๊ณผ์ •์„ ํ•˜๋‚˜์”ฉ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Step 1

git checkout feature

feature ๋ธŒ๋žœ์น˜๋กœ ์ฒดํฌ์•„์›ƒํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. head๋Š” feature๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

image.png

Step 2

git rebase master

master์™€ feature์˜ ๊ณตํ†ต ์กฐ์ƒ์ด ๋˜๋Š” base ์ปค๋ฐ‹๋ถ€ํ„ฐ ํ˜„์žฌ ๋ธŒ๋žœ์น˜๊นŒ์ง€์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(โ–ต1, โ–ต2)์„ ๊ตฌํ•ด์„œ patch๋กœ ์ €์žฅํ•ด ๋‘ก๋‹ˆ๋‹ค.

image.png

Step 3

head๋ฅผ master๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

image.png

Step 4

Applying f1

head๊ฐ€ ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” m2์— ๋ณ€๊ฒฝ์‚ฌํ•ญ โ–ต1 ์„ ์ ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹ f1'์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

image.png

Step 5

Applying f2

f1'์— ๋ณ€๊ฒฝ์‚ฌํ•ญ โ–ต2 ์„ ์ ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹ f2'์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

image.png

Step 6

์ด์ œ feature๊ฐ€ f2'๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

image.png

f1๊ณผ f2๋Š” ์ €์žฅ์†Œ ๋‚ด์—๋Š” ์กด์žฌํ•˜์ง€๋งŒ, tag๋‚˜ branch์—์„œ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์—†๋Š” dangling ์ƒํƒœ๊ฐ€ ๋˜๋ฉฐ, dangling ๋œ ์ปค๋ฐ‹์€ ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค.

Step 7

git merge feature

feature๋ฅผ master๋กœ fast-forward mergeํ•˜์—ฌ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

image.png

๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ: Merge vs Rebase

์ด์ œ๊นŒ์ง€ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์˜ ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ์ „๋žต์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. Merge๋ฅผ ์‚ฌ์šฉํ•  ์ง€, Rebase๋ฅผ ์‚ฌ์šฉํ•  ์ง€๋Š” ํ”„๋กœ์ ํŠธ์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์–ด๋–ค ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋จผ์ € Merge์˜ ๊ฒฝ์šฐ ํžˆ์Šคํ† ๋ฆฌ๋ž€ ์ž‘์—…ํ•œ ๋‚ด์šฉ์˜ ์‚ฌ์‹ค์„ ๊ธฐ๋กํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Merge๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ฒŒ ๋˜๋ฉด ์ปค๋ฐ‹ ๋‚ด์—ญ์— Merge commit์ด ์ถ”๊ฐ€๋กœ ๋‚จ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Merge๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ธŒ๋žœ์น˜๊ฐ€ ์ƒ๊ธฐ๊ณ  ๋ณ‘ํ•ฉ๋˜๋Š” ๋ชจ๋“  ์ž‘์—… ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ๊ธฐ๋กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ Rebase์˜ ๊ฒฝ์šฐ๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ๋ณ‘ํ•ฉํ•  ๋•Œ ์ด๋Ÿฐ Merge commit์„ ๋‚จ๊ธฐ์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋งˆ์น˜ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋Š” ์—†์—ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ํ”„๋กœ์ ํŠธ์˜ ์ž‘์—… ๋‚ด์šฉ์ด ํ•˜๋‚˜์˜ ํ๋ฆ„์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
image.png

๋ธŒ๋žœ์น˜๋ฅผ ํ•ฉ์น  ๋•Œ Merge๋ฅผ ์จ์•ผ ํ•˜๋Š”์ง€ Rebase๋ฅผ ์จ์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์ •๋‹ต์ด ์—†์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋‚˜ ํŒ€์˜ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ „๋žต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ๋กœ์ปฌ์—์„œ๋Š” ํžˆ์Šคํ† ๋ฆฌ ์ •๋ฆฌ๋ฅผ ์œ„ํ•ด Rebase๋ฅผ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด๋ฏธ ์›๊ฒฉ ์ €์žฅ์†Œ์— Push๋œ ์ปค๋ฐ‹์€ Rebase๋ฅผ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ ๋ฐ ์ถ”์ฒœ ๋งํฌ