[Git] git rebase์ git merge์ ์ดํด
์ ๊ทธ๋๋ ์ต๊ทผ Git Flow๋ฅผ ๋ฐฐ์ฐ๋ฉฐ rebase๊ฐ ํท๊ฐ๋ ธ๋๋ฐ ๋ง์นจ ์ด๋ฒ ์ํด๋ฆฌ ํ์ดํผ ์ฃผ์ ๊ฐ rebase๋ฅผ ๋ค๋ฃจ๊ฒ ๋๋ค. (์ฌ์ค ๋ ๊ฐ์ ์ด๋ณด์๋ ์์ง ํ์ ๋ฆฌํฌ์์ merge๋ง ํด๋ณผ ๋ฟ, rebase๋ ํ ์ ์ด ์๋ค.)
rebase์ merge๋ฅผ ์ฝ๊ฒ ์ดํดํ๊ธฐ ์ํด ์์๋ ์ด์ฌํ ์์ฑํ์ผ๋ ๋ ๊ฐ์ ์ด๋ณด๋ค์๊ฒ ๋์์ด ๋๊ธฐ๋ฅผ.
๐ ์ฃผ์
git rebase์ git merge์ ์ฐจ์ด์ ์ ์ค๋ช ํ๊ณ , ๊ฐ๊ฐ ์ด๋ค ์ํฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ์ง ์ค๋ช ํด์ฃผ์ธ์.
์ฐ์ ๊ฐ ๊ฐ๋
์ ์ดํด๋ณด์.
๋ ์ต์ํ ๋จธ์ง๋ฅผ ๋จผ์ ์ดํด๋ณด๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.
โ git merge
git merge๋?
๋ง ๊ทธ๋๋ก ํฉ์น๋ ๊ฒ์ด๋ค. ๋ณดํต ๋จธ์ง๋ฅผ ์ฐ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ๋ค.
0. develop ๋ธ๋์น๋ก๋ถํฐ feature1, feature2 ๋ธ๋์น๋ฅผ ์์ฑ, ๋ถ๊ธฐํ๋ค.
1. feature1, feature2 ๋ธ๋์น์์ ๊ฐ์ ์์
ํ๋ค.
2. ์์
์ด ์๋ฃ๋์ด feature1 ์์
๋ด์ฉ์ develop ๋ธ๋์น๋ก ํฉ์น๋ค.
3. feature2 ์์
๋ด์ฉ์ develop ๋ธ๋์น๋ก ํฉ์น๋ค.
์ฐธ๊ณ ํ git ๋ฌธ์์์๋ ๊ฐ ์ปค๋ฐ์ด ์๋ ๋ด์ฉ์ ํฉ์ณ์ง๋ค๋ ์๋ฏธ๋ก
ํ์ดํ๊ฐ ์ด์ ์ปค๋ฐ์ ํฅํ์ง๋ง
์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ์๊ฐํด๋ณด๊ณ ์ถ์ด์ ๋ด ๊ทธ๋ฆผ์์๋ ๋ค์ ์ปค๋ฐ์ ํฅํ๋ค.
ํ์ฌ ์๊ฒฉ ์ ์ฅ์์ ์ปค๋ฐ์ด ๋ค์๊ณผ ๊ฐ์ด ์กด์ฌํ๊ณ , develop ๋ธ๋์น๋ ๊ฐ์ฅ ์ต์ ์ปค๋ฐ์ ์๋ค.
develop ๋ธ๋์น๋ก๋ถํฐ feature1, feature2 ๋ธ๋์น๋ฅผ ๋ง๋ ๋ค.
$ git checkout -b feature1
$ git checkout -b feature2
feature1, feature2 ๋ธ๋์น์์ ๊ฐ๊ฐ ์์ ์ ํ๊ณ ์ปค๋ฐ์ ํ๋ค. develop ๋ธ๋์น์์๋ณด๋ค ๋ ๋ง์ ์์ ์ ํ๊ณ ์ปค๋ฐ์ ํ๊ธฐ ๋๋ฌธ์ feature ๋ธ๋์น๋ค์ ์์ผ๋ก ๋์๊ฐ๋ค.
$ git commit -m "feature1"
$ git commit -m "feature2"
feature1์์ C3 ์ปค๋ฐ ๋ด์ฉ์ develop ๋ธ๋์น์ ํฉ์น๋ค.
$ git checkout develop
$ git merge feature1
Fast forward
feature1 ๋ธ๋์น๋ develop์ด ๊ฐ๋ฆฌํค๋ C2 ์ปค๋ฐ์์ ๊ธฐ๋ฐํ์๊ธฐ ๋๋ฌธ์ develop ๋ธ๋์น์์๋ ๋จ์ํ C3 ์ปค๋ฐ ๋ด์ฉ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋๋ฏ๋ก, develop ๋ธ๋์น ํฌ์ธํฐ๋ feature1๊ณผ ๊ฐ์ด C3 ์ปค๋ฐ์ ๊ฐ๋ฆฌํจ๋ค. ์ด๋ ๊ฒ ๋จ์ํ ์์ผ๋ก ์ด๋ํ๋ ๊ฒ์ Fast forward ๋ฐฉ์์ด๋ผ๊ณ ํ๋ค.
feature2 ๋ธ๋์น์์ ์ถ๊ฐ ์์
์ ํ๊ณ , ์ปค๋ฐ์ ํด๋
develop, feature1๊ณผ๋ ์ ํ ๊ด๊ณ๊ฐ ์๋ค.
$ git checkout feature2
$ git commit -m "feature2:C5"
์ด์ feature2 ๋ธ๋์น๋ฅผ develop์ ํฉ์ณ๋ณด์.
$ git checkout develop
$ git merge feature2
3-way Merge
Fast forward ๋์ฒ๋ผ ๊ฐ๋จํ ํฉ์น ์ ์๋ค. feature2๋ develop๊ณผ๋ ๋ค๋ฅธ ํ์คํ ๋ฆฌ๋ฅผ ์์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋๋ ๊ฐ ๋ธ๋์น๊ฐ ๊ฐ๋ฆฌํค๋ ์ปค๋ฐ ๋ ๊ฐ์, ๋ ๋ธ๋์น์ ๊ณตํต ์กฐ์์ ์ด์ฉํ์ฌ 3-way Merge๋ฅผ ํ๋ค.
develop ๋ธ๋์น์ ํฌ์ธํฐ๊ฐ ์ต์ ์ปค๋ฐ C5๋ก ์ฎ๊ฒจ๊ฐ๋ ๊ฒ ์๋๋ผ, ๊ณตํต ์กฐ์ C2, develop ๋ธ๋์น์ ํ์ฌ ์์น C4, feature2 ๋ธ๋์น์์ ๋จธ์งํ๊ณ ์ ํ๋ C5, ์ด ์ธ ์ปค๋ฐ์ git์์ ์ ์ ํ mergeํ๊ณ (๊นํ๋ธ๊ฐ ์์์ ํด์ค๋ค), ์ด๋ฅผ ์ฑ๊ณตํ๋ฉด ์๋ก์ด ๋ณ๋์ ์ปค๋ฐ C6์ ๋ง๋ ๋ค.
๊ทธ๋ฆฌ๊ณ develop ๋ธ๋์น๋ ์ด C6์ ๊ฐ๋ฆฌํจ๋ค.
๊ทธ๋ผ ์ต์ข
์ ์ผ๋ก develop ๋ธ๋์น์ ํ์คํ ๋ฆฌ๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋๋ค.
๊ฐ์ฅ ์ฒ์ ์ปค๋ฐ์ธ C0๋ถํฐ ๊ฐ์ฅ ์ต์ ์ปค๋ฐ์ธ C6๊น์ง์ ๋ชจ๋ ์ปค๋ฐ์ ๋ค ๋ด๊ณ ์๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
C0 -> C1 -> C2 -> C3 -> C4 -> C5 -> C6
โ git rebase
git rebase๋?
re"base"๋ผ๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ ๋ธ๋์น์ ๋ฒ ์ด์ค๋ฅผ ์๋กญ๊ฒ ์ค์ ํ๋ค๋ ๋ป์ด๋ค.
- base: ํน์ ๋ธ๋์น๊ฐ ์์ฑ๋ ์์ ์ ๊ธฐ์ค์ ์ด ๋๋ ์ปค๋ฐ(๋ธ๋์น์ ํ์คํ ๋ฆฌ ์ค ๊ฐ์ฅ ๋จผ์ ์์ฑ๋ ์ปค๋ฐ)
๋๋ฃ ๊ฐ๋ฐ์๊ฐ ๊ณต์ ๋ธ๋์น์ ์๋ก์ด ์ปค๋ฐ์ ์ฌ๋ฆฌ๊ณ , ๊ทธ๊ฒ์ ๋ด ๋ธ๋์น์ ๋ฐ์ํด์ผ ํ ๋, rebase๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ต์ ์ปค๋ฐ์ ๋ธ๋์น์ ๋ฐ์ํ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ๊ฐ์ ํด๋ณด์.
develop ๋ธ๋์น์ C1 ์ปค๋ฐ ์์ ์์ feature1, feature2 ๋ธ๋์น๋ก ๊ฐ๊ฐ ๋ถ๊ธฐํ์ฌ ์์
์ ์ด์ด ๋๊ฐ๋ค.
์ด๋ ๊ฐ ๋ธ๋์น์ ๋ฒ ์ด์ค๋?
- develop: C0
- feature1: C1
- feature2: C1
feature1์ ์์ ์ด ๋๋ develop์ mergeํ์๋ค. feature1์ develop์ ์ต์ ์ปค๋ฐ์ผ๋ก๋ถํฐ ์ด์ด์ง ๋ธ๋์น์ด๋ฏ๋ก Fast forward ๋ฐฉ์์ด๋ค.
$ git checkout develop
$ git merge feature1
feature2์์ ์์
ํ๋ ๊ฐ๋ฐ์๊ฐ ์๋กญ๊ฒ ์
๋ฐ์ดํธ๋ develop์ ๋ด์ฉ์ ๋ฐ์ํ๊ณ ์ถ๋ค๋ฉด, ์ฆ feature2๊ฐ develop์ ์ปค๋ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ ์์ฑ๋๊ธธ ์ํ๋ค๋ฉด
feature2์ ๋ฒ ์ด์ค๋ฅผ develop์ ์ต์ ์ปค๋ฐ์ผ๋ก ์ฎ๊ธฐ๋ฉด ๋๋ค.
= feature2๋ฅผ develop ์๋ก ์ฌ๋ฆฐ๋ค.
- feature2์ ์๋ก์ด ๋ฒ ์ด์ค: C3
$ git checkout feature2
$ git rebase develop
์ด๋ฌ๋ฉด merge๋ฅผ ํ์ง ์์๋๋ฐ๋, feature2๊ฐ develop์ ๋ด์ฉ์ ๊ฐ์ง๊ฒ ๋๋ค.
๋ง์ฝ feature2์์ ํ ๋ฒ ๋ ์ปค๋ฐ์ ์์
์ ๋ง๋ฌด๋ฆฌํ ํ
develop์ ์ด ์์
๋ด์ฉ์ ํฉ์น๊ณ ์ถ๋ค๋ฉด develop์์ merge๋ฅผ ํ๋ฉด ๋๋ค. feature2์ ๋ฒ ์ด์ค๊ฐ develop์ ์ต์ ์ปค๋ฐ์ด๋ฏ๋ก Fast forward ๋ฐฉ์์ด๋ค.
$ git checkout develop
$ git merge feature2
์ด๋ merge ๋์ ๋ฌผ๋ก rebase๋ฅผ ํด๋ ๋๋ค. ์ด๋๋ develop์ ๋ฒ ์ด์ค๋ฅผ feature2๋ก ํ๋ฉด ๋๋ค.
feature2์ ์ปค๋ฐ ํ์คํ ๋ฆฌ์ด๋ค.
๋ฒ ์ด์ค์๋ C1์ผ๋ก๋ถํฐ develop์ ์ต์ ์ปค๋ฐ์ธ C2, C3์ ํฌํจํ๊ฒ ๋๋ค.
develop์ ์ปค๋ฐ ํ์คํ ๋ฆฌ์ด๋ค.
feature2๊ฐ Fast forward ๋ฐฉ์์ผ๋ก ํฉ์ณ์ ธ feature2์ ์ต์ ์ปค๋ฐ์ผ๋ก ์ฎ๊ฒจ๊ฐ๋ค.
โ ๏ธ ์ฃผ์์ฌํญ: ์ด๋ฏธ pushํ ์ปค๋ฐ์ rebaseํ์ง ๋ง๋ผ!
๋ธ๋์น๊ฐ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ ํ์. ๋ชจ๋ ์ปค๋ฐ์ push๋์ด ์๋ค.
A --- B --- C (origin/main)
\
D --- E (feature)
์ฌ๊ธฐ์ feature๋ฅผ main์ผ๋ก rebaseํ๋ฉด ์๋์ฒ๋ผ ๋๋ค.
A --- B --- C (origin/main)
\
D' --- E' (feature)
D์ E๋ rebase ์ ๊ณผ ๋ด์ฉ์ด ๋ง์ฝ ๋ฌ๋ผ์ง์ง ์์๋๋ผ๋ ์ปค๋ฐ์ ID๋ ๋ค๋ฅด๋ค. D์ E ์ปค๋ฐ์ ์ฌ๋ผ์ง ๊ฒ์ด๋ค.
๋ง์ฝ rebaseํ ๋ ๋ง๊ณ ๋ค๋ฅธ ์ฌ๋์ด ์ด๋ฏธ D์ E์์ ์์
์ค์ด์๋ค๋ฉด?
๋ฆฌ๋ชจํธ์ ํ์คํ ๋ฆฌ๊ฐ ๋ณ๊ฒฝ๋๋ฉด์ ๊ธฐ์กด์ D์ E ์ปค๋ฐ์ด ์ฌ๋ผ์ก๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ git pull์ ์๋ํ ๋ ์ถฉ๋์ด ๋ฐ์ํ๋ค.
๐ต๏ธ ์ฐจ์ด์
merge์ rebase๋ฅผ ๋จ์ํ๊ฒ ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค. ๊ฒฐ๊ณผ๋ฌผ์ ๊ฐ์ง๋ง ๋๋ฌํ๋ ๊ณผ์ ์ด ๋ค๋ฅด๋ค.
merge๋ ๋ ๋ธ๋์น๊ฐ ํฉ์ณ์ก๋ค๋ ๊ฒ ๋ช
ํํ ๋๋ฌ๋๊ณ , rebase๋ ํ์คํ ๋ฆฌ๊ฐ ์ง๋ ฌ๋์ด ์๋ค.
๋ธ๋์น๊ฐ ๋ง์์ง๋ฉด ๋ง์์ง์๋ก ๊ทธ ์ฐจ์ด๊ฐ ๋ ๋ช ํํ๋ค.
- 3-Way Merge๋ฅผ ๊ธฐ์ค์ผ๋ก merge๋ ์๋ก์ด ์ปค๋ฐ์ ๋ง๋ ๋ค. ๊ทธ๋ฌ๋ rebase๋ ์๋ก์ด ์ปค๋ฐ์ ๋ง๋ค์ง ์๊ณ , ๋ค๋ฅธ ๋ธ๋์น์ ์๋ก ์ฌ๋ผ๊ฐ๋ค.
- ๋ฐ๋ผ์ rebase๋ก ๋ง๋ค์ด์ง ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ merge๋ก ๋ง๋ค์ด์ง ํ์คํ ๋ฆฌ๋ณด๋ค ๊น๋ํ๋ค.
๐ ์์ฝ
git merge
- ๋ ๋ธ๋์น์ ์ต์ ์ปค๋ฐ๋ผ๋ฆฌ ํฉ์ณ์ ธ ์๋ก์ด ์ปค๋ฐ์ ๋ง๋ ๋ค.
- ๋ ๋ธ๋์น๋ฅผ ํฉ์ณค๋ค๋ ์ ๋ณด๊ฐ ์ปค๋ฐ ํ์คํ ๋ฆฌ์ ๊ผญ ๋จ์์ผํ๋ ๊ฒฝ์ฐ merge๋ฅผ ์ฌ์ฉํ๋ค.
git rebase
- rebase๋ฅผ ํ๋ ค๋ ๋ธ๋์น๊ฐ base๊ฐ ๋ ๋ธ๋์น์ ์๋ก ์ฌ๋ผ๊ฐ๋ค.
- ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ฅผ ๊น๋ํ๊ฒ ์ ์งํ๋ ๊ฒ ๋ ์ค์ํ ๊ฒฝ์ฐ rebase๋ฅผ ์ฌ์ฉํ๋ค.
- ๋จ, ํ์คํ ๋ฆฌ๋ฅผ ์กฐ์ํ๋ ํ์์ด๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
- ์ด๋ฏธ ์๊ฒฉ์ pushํ ์ปค๋ฐ์ rebaseํ์ง ๋ง๋ผ.
- ๋ค๋ฅธ ๋๋ฃ๊ฐ ์์ ์ค์ธ, ์๊ฒฉ ์ ์ฅ์์ ๊ณต๊ฐ๋ ๋ธ๋์น๋ฅผ ๋์์ผ๋ก ๋ฆฌ๋ฒ ์ด์คํ์ง ๋ง๋ผ๋ ๋ป์ด๋ค.
- ๋์ ๋ฉํ ๋์ ๊ทธ๋ฅ rebase๋ ์ฐ์ง ๋ง๋ผ๊ณ ์ถ์ฒํ์ จ๋ค ใ ใ
์ฐธ๊ณ ์๋ฃ
๊ทธ๋ฆผ: ๋
์ฝ๋์ ์คํ๋ฆฐํธ ๊ฐ์ ๋ ธํธ
Git ๋ธ๋์น - ๋ธ๋์น์ Merge ์ ๊ธฐ์ด
Git ๋ธ๋์น - Rebase ํ๊ธฐ
[Git] Git Rebase ์ ๋ํด ์์ธํ ์์๋ณด์
[Git] Git Rebase ๋? / ์ฝ๊ฒ ์ดํดํ๊ธฐ / ์์