๐ป GIT flow & GIT rebase ๐ป
(๋ด๊ฐ ๋ณด๋ ค๊ณ ์ ๋ฆฌํ๋ git flow & GIT rebase)
๐จ git flow๋? ๐จ
* ํฌ๊ฒ main branch / feature branch๋ก ๋๋ ์ ๊ด๋ฆฌ
-
์ฌ๊ธฐ ์ค๊ฐ์ develop branch๊ฐ ๋ค์ด์ด! (main branch๋ผ๊ณ ์๊ฐํด๋๋จ..!)
โ develop branch ์ฐ ๋ฐฐํฌ๋ฅผ ์ํ ๋ง์ง๋ง ๋จ๊ณ์ ๋ธ๋์น๋ผ๊ณ ์๊ฐํ๋ฉด ๋จ! โ
-
์ค์ ๋์๊ฐ๋ ์ฝ๋๋ฅผ main branch
-
๊ทธ ๋ฐฐํฌ ๋ฐ๋ก ์ง์ ๋จ๊ณ์์ ์ฐ๋ develop branch
-
์ฌ๊ธฐ์ ๋ฒ๊ทธ ๊ณ ์น๋ฉด์ ์์ ํด๋๊ฐ ์ ์๋ release branch
-
๊ณ์ ๊ณ ์ณ๋๊ฐ๋ฉด์ ์ฐ๋ feature branch
(๐ซ ๊ธฐ๋ณธ์ ์ผ๋ก feature์์ ์์ ํ ๊ฑฐ ๋ค ํ๊ณ develop์ผ๋ก ๊ฐ๋๋ฐ, ๊ทธ ์์ค์์ ๋ฒ๊ทธ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด release๋ฅผ ๋ง๋ค์ด์ ๋ฒ๊ทธ ๋ง๋ฌด๋ฆฌํ๊ณ main์ผ๋ก ๊ฐ.)
(๐ซ develop์์ ๋จธ์ง๋ฅผ ํ๊ณ main์ผ๋ก ์ฌ๋ฆผ)
- ๋ง์ง๋ง์ผ๋ก Htfix branch๋ฅผ ๋ง๋ค์ด์ ์ต์ข
์์ ํด์ Main์ผ๋ก ๋จธ์ง.
๐จ git rebase์ด๋? ๐จ
- ๋ถํ์ํ merge commit๋ค์ด ์์ฑ
(๋ชจ๋ feature branch๋ง๋ค merge commit์ด ๋จ์.. ํ์ ๊ท๋ชจ๊ฐ ํฌ๋ฉด ์ง์ง ์ ์ ์๊ฒ ์ฐ.)
- ๋ณต์กํ ํ๋ก์ ํธ history
(์ ์ ์๋ merge commit๋๋ฌธ์ ๋ฒ์ ๊ด๋ฆฌ๋ ํ๋ค์ด์ง)
- git rebase์ ์ฅ์
Rebase๋ ๋ด commit์ base๋ฅผ ๋ณ๊ฒฝํ์ฌ commit history๋ฅผ ์ผ๋ ฌ๋ก ์ ๋ฆฌํด์ค๋ค.
(<-> ๋ฐ๋ฉด merge๋ ๊ทธ๋๋ก ํฌ๊ฐ๋ฏ ๊ฒน์ณ์ ธ์ ๋ชจ๋ commit์ ๋ค ํก์ํ๋ ๋ฌ๋ฐ)
๐จ git squash๋? ๐จ
- ์ฌ๋ฌ๊ฐ์ ์ปค๋ฐ์ ํ๋๋ก ํฉ์ณ์ฃผ๋ ๊ฒ
๐จ Rebase replaces Merge ๐จ
๐ซ ์๋ก์ด ์์
์ ๋ชจ๋ ๋ง์น๊ณ pushํ๊ธฐ ์ ์๋!
1. Main branch๋ก ์ด๋ํด remote main์ pull ๋ฐ๊ธฐ
2. ๋ด๊ฐ push ํ feature branch๋ก ์ด๋
3. git rebase -i main ์ ์งํ
4. ๊ทธ๋ค์ ๐นpush๐น
๐ซ rebase ํ๋ ๋์ squash ์งํํ ๋์๋!
1. ๊ฐ์ฅ ์ค๋๋ commit์ ์ ํํ๋ค (์๊ฑธ pick)
2. ๋ค๋ฅธ ์ปค๋ฐ ๋ฉ์์ง๋ ๊ฐ์ฅ ์ค๋๋ commit์ ๊ธฐ์ค์ผ๋ก squashํ๋ค!
(์๊ฑธ S๋ผ๊ณ ํด) -> ๊ทธ๋ ๊ฒํ๋ฉด ์ธ๊ฐ์ ์ปค๋ฐ์ด ํ๋๋ก ํฉ์ณ์ง๋ ๊ฒ! ๐๋ฆฌ๋ฒ ์ด์ค!๐
3. ๋ค๋ฅธ ์ปค๋ฐ์ ์์
๋ด์ญ์ด ์์ด์ง๋ ๊ฒ์ด ์๋
4. ESC -> :wq๋ก ๋น ์ ธ๋์ค๊ธฐ
๐จ Example! ๐จ
- ๋ด๊ฐ feature์์ ์์
์ค!
- ๋ด ์ ํ์A๊ฐ merge๊ฐ ๋์.(์ฝ๋๊ฐ ์
๋ฐํฌ ๋์์ด.)
- git checkout main / git pull origin main ํด์ ๋ฐ์์ค๊ธฐ
- ๊ทธ์ํ์์ ๋ค์ ๋ด feature branch๋ก ์ด
- ๊ทธ๋ผ ์ด์ ๋ด๊บผ A๊บผ ๊ฐ์ด ํฉ์ณ์ค์ผ ๋ด ์ฝ๋๊ฐ ์
๋ฐํฌ ๋๊ฒ ์ง?
- git rebase -i main ์ด๋ผ๊ณ ์น๋ฉด -> ์ ์ฌ์ง์ฒ๋ผ pick, pick, pick์ฒ๋ผ ๋จ๊ฒ ์ง?
- ๊ฐ์ฅ ์์๊บผ๋ง pick์ผ๋ก ๋จ๊ธฐ๊ณ ๋๋จธ์ง๋ s๋ก ๋จ๊ธฐ๊ณ (squash) :wq!ํด์ ์ ์ฅ!
- ๊ทธ๋ฌ๋ฉด, ์๊น commit3๊ฐ๋ฅผ ํฉ์ณค์ผ๋๊น ๊ฐ๊ฐ์ ๋ด์ฉ์ด ์์๊ฑฐ์๋?
- ๊ทธ๋ผ ๊ทธ๊ฑฐ์ ๋ํด์ ์๋ก์ด ๋ฉ์์ง๋ฅผ ํ๋ ๋ง๋ค์ด์ ์ต์ข
commit message๋ฅผ ๋ง๋ค์ด์ค์ผํด.
- ์ด๋ ๊ฒ commit message ๊น๋ํ๊ฒ ์ ๋ฆฌํด์ค์ผํจ! :wqํ๊ณ ๋น ์ ธ๋์ค๊ธฐ.
- "Successfully rebased!"๋ผ๊ณ ๋ฉ์์ง๊ฐ ๋จ๋ฉด ๊ตฌ์~
- git log ๋ก ์ซ์
ํ์ธํด์ฃผ๊ณ !
- ๋ค์ ์์
์ด์ด๋๊ฐ์ฃผ๊ธฐ.
๐จ rebase ํ push! ๐จ
-
๋ค์ ํ ๋ฒ ๋งํ์ง๋ง rebase๋ commit history๋ฅผ ์ ๋ฆฌํ๋ ์ญํ .
commit message๋ฅผ ์ ๋ฆฌํด์ฃผ๋๊น ์๋ก์ด ์ปค๋ฐ์ผ๋ก ์๊ฐํด์ ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋์ฌ ์ ์์ !
-
๊ทธ๋ด ๋๋ <git push origin feature/login -f> ๋ช
๋ น์ด!
-
์ผ๋จ ๋จผ์ push ํด๋ณด๊ณ ์ค๋ฅ๊ฐ ์๊ธธ๊ฒฝ์ฐ, push -f ํด์ฃผ๊ธฐ!
๐จ ์ถฉ๋์ด ๋๋ฉด? ๐จ
- ์ถฉ๋์ด ์ผ์ด๋ ๊ฒฝ์ฐ ๋นํฉํ์ง๋ง๊ณ !
์ด๋ฐ์์ผ๋ก ์ถฉ๋๋ ์ปค๋ฐ์ ๋ํด ์ค๋ฅ๋ฉ์์ง๊ฐ ๋ฐ๊ฑฐ์ผ.
๊ทธ๋ผ ๊ทธ ์ถฉ๋๋ ๋ถ๋ถ์ ํด๊ฒฐํด์ฃผ๋ฉด ๋จ.
- git add ํ๊ธฐ. (git commit๊น์ง ํ ํ์๋ ์์ด.)
- git rebase __continue ๋ฅผ ์งํํ๊ธฐ
- ๊ทผ๋ฐ ๋ ์ถฉ๋๋๋ฉด? ๋ git add -> git rebase __continue.. ๋ฐ๋ณต!
- ๋ง์ง๋ง ์ถฉ๋๊น์ง ํด๊ฒฐ๋๋ฉด successfully rebased! ํ๊ณ ๋๋จ!
- ๊ทผ๋ฐ ๊ณ์ ํด๊ฒฐ์ด ์๋๋ฉด, git rebase __abort ๋ก ์์ rebase๋ฅผ ์งํํ๊ธฐ ์ ์ํฉ์ผ๋ก ๋์๊ฐ ์๋ ์๋ค!
- ๋ฉ์ธ๋ธ๋์น์์ ์์
๋
ธ!
๐ญ ๊ฑฐ๊ธฐ์ ์์
ํ๋ฉด ์๋ผ.. ์ ๋ง๋ฅ ๐ญ
- ๋ฆฌ๋ฒ ์ด์ค ์ํฉ์๊ณ ์ถ์ผ๋ฉด git status ์ณ๋ณด๋ฉด ์ ์ ์์.
๐จ git ๋ช
๋ น์ด ๐จ
git reset soft vs hard
git log
git reflog
git checkout
git stash & git stash apply & git stash clear
๐จ git ์ค์ต! ๐จ
- clone๋จผ์ ๋ฐ๊ณ !
- ํ์ผ๋ค์ด๊ฐ์, feature/rebase ๋ง๋ค์ด์ ๊ฑฐ๊ธฐ๋ฃจ ๋ค์ด๊ฐ
- commit 5๊ฐ ์ ๋ ๋ง๋ค๊ธฐ
- ๋๊ตฐ๊ฐ ๋ฉ์ธ์์ ์๋ก์ด ๋ณ๊ฒฝ์ฌํญ์ ๋ง๋ค์ด์ ํธ์ํจ.
- ๊ทธ๊ฑธ ํ๋ฐ์์ค๊ธฐ ์ํด git checkout main ํด์ git pull origin main ๋ฐ์์ค๊ธฐ(main์์ ํ๋ฐ๋๊ฑฐ์ผ..)
- ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ด feature/rebase๋ก ๋์์ค๊ธฐ
- ๋ด๊ฐ ํ 5๊ฐ ์ปค๋ฐ์ด๋ ํ๋ฐ์์จ๊ฑฐ ๋ค ํฉ์ณ์ค์ผํ๋๊น git rebase -i mainํ๋ฉด! ์ค์ฟผ์ s๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ~~
- :wqํ๊ณ ๋๊ฐ๋ฉด ์๋ ํ๋ฉด์ฒ๋ผ ๋ฌ๋ค.
- ์ด์ ์ฌ๊ธฐ์ ์ต์ข
commit message๋ฅผ ์ ์ด์ฃผ๋ฉด๋จ!
tip) esc๋๋ฅธ์ํ์์ dd ๋๋ฌ์ฃผ๋ฉด ํ๋ฒ์ ์ง์์ง~!
- ์จ๋- ์ฑ๊ณต์ ์ด๋ผ๊ณ ๋จ์ง? ํใ
ใ
ใ
....^^
- ์๊ธฐ์ git push origin feature/rebase ๋ฅผ ํ๊ณ , pr์ ์ฌ๋ฆฌ๋ฉด,
์๋ ๊ฒ ์ ๋ธ ^^
- ์ด๋ฏธ ๋ค ๋๋ ์ํ์์, ํ๋ฒ ๋ ์ปค๋ฐํ ์ผ์ด ์๊ฒผ๋ค?
- ๋๊ฐ์ด ์์ ํด์ฃผ๊ณ add commit rebase ํด์ฃผ๋ฉด ๋จ -> ์ด์ push! git push origin featrue/rebase :>
- ์๋ฌ๊ฐ ๋จ๋๊น git push origin featrue/rebase -f ๋ก ์งํํด์ฃผ๋ฉด๋จ!
๐ git rebase ์๋ฃ ์ถ์นดํฌ์นด! ๐
๐ฝ ๋ฉด์ ์ง๋ฌธ?
๐ฅ ๊น ๋ฆฌ๋ฒ ์ด์ค / ๋จธ์ง์ ์ฐจ์ด์
- git rebase๋ git merge์ ๊ฐ์ด ์ฝ๋๋ฅผ ํฉ์น๋ ๋ช
๋ น์ด์
๋๋ค. ํ์ง๋ง git rebase๋ฅผ ์ฌ์ฉํ๋ค๋ฉด git merge๋ก mergeํ๋ ๊ฒ๋ณด๋ค ์ปค๋ฐ ํ์คํ ๋ฆฌ๊ฐ ํจ์ฌ ๊น๋ํ๊ฒ ๋จ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์์
์ ๋ณด๊ธฐ๊ฐ ํธํด์ง๋๋ค.
Merge๋ Merge commit ๊ธฐ๋ก์ด ์ถ๊ฐ๋ก ๋จ๊ฒ ๋์ง๋ง Rebase์ ๊ฒฝ์ฐ์๋ branch ๋ณํฉ ์ Merge commit ๊ธฐ๋ก์ด ๋จ์ง ์์ ๋ง์น ํ๋์ ๋ธ๋์น์์ ์์
ํ ๊ฒ์ฒ๋ผ ๋ณด์ฌ์ง๋ค.
๐ rebase ๐
๐ merge ๐
๐ฅ ๊น ์ค์ฟผ์๋ ์ด๋ป๊ฒ ๋์ํ๊ณ , ์์ฐ๋๊ฐ?
- git squash๋ ์ฌ๋ฌ๊ฐ์ ์ปค๋ฐ์ ํ๋๋ก ํฉ์ณ์ฃผ๋ ๊ฒ์ผ๋ก git rebase์ ๊ณผ์ ์ค ํ๋๋ก ๋ณผ ์ ์์ต๋๋ค. ๊น ์ค์ฟผ์๋ ๊น ๋ฆฌ๋ฒ ์ด์ค๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋๋ฐ ์ฌ๋ฌ ์ปค๋ฐ๋ค์ 's'๋ก ๋ณ๊ฒฝํ ๋ค์ ์ ์ฅํ๋ฉด ์ฌ๋ฌ๊ฐ์ ์ปค๋ฐ์ ํ๋๋ก ๋ง๋ค ์ ์์.
๐ฃ ์ข ๋ ์์ธํ!
git rebase๋ ๋ง ๊ทธ๋๋ก ์ปค๋ฐ์ base๋ฅผ ๋ค์(re) ์ ํ๋ ์์
์
๋๋ค. ์ฐ๋ฆฌ๊ฐ ์
๋ ฅํ๋ $ git rebase master dev๋ผ๋ ๋ช
๋ น์ด๋ฅผ ํ์ด์ ์ค๋ช
ํ์๋ฉด โmaster์ dev ๋ธ๋์น์ ๊ณตํต ์กฐ์ ์ปค๋ฐ๋ถํฐ dev ๋ธ๋์น๊น์ง์ ๋ชจ๋ ์ปค๋ฐ์ base๋ฅผ master ๋ธ๋์น์ ์์น๋ก ๋ฐ๊พธ์ด๋ผโ๋ผ๋ ์๋ฏธ์ธ ๊ฒ์ด์ฃ . ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ master์ dev์ ๊ณตํต ์กฐ์ ์ปค๋ฐ์ธ C1๋ถํฐ dev์๋ง ์์๋ C4, C5 ์ปค๋ฐ๋ค์ด master ๋ธ๋์น๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ C3์ base๋ก ํ์ฌ ๋ค์ ์ ์ฉ๋ ๊ฒ์
๋๋ค.
๋ง์ ๋์ ์ป๊ณ ๊ฐ๋๋ค..์ด์ด.. ์ง์ง ์ ๋ฆฌ ๋๋ฌด ์ํด..