๐๏ธ [Medium] ๋ด๊ฐ ์ํ๋, Git ๊ฐ์ด๋ (2)
Rebasing ๊ณผ Merging Rebasing์ Merging๊ณผ ๋น๊ตํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ ๋ช ๋ น์ ๋ชฉํ๋ ๊ฐ์ง๋ง ์ด๋ฅผ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฆ ๋๋ค. ์ค์ํ ์ฐจ์ด์ ์ Rebasing์ด ํ๋ก์ ํธ์ ํ์คํ ๋ฆฌ๋ฅผ ์ฌ์์ฑํ๋ค๋ ๊ฒ์ ๋๋ค. ๊น๋ํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ํ๋ก์ ํธ ํ์คํ ๋ฆฌ๋ฅผ ์ค์์ํ๋ ํ๋ก์ ํธ์ ์ ํฉํฉ๋๋ค. ๋ฐ๋ฉด, Merging์ ์๋ก์ด ๋ณํฉ ์ปค๋ฐ์ ์์ฑํ์ฌ ๋ ๋ธ๋์น์ ํ์คํ ๋ฆฌ๋ฅผ ์ ์งํฉ๋๋ค. ย Squashing Git Squashing์ ์ฌ๋ฌ ์ปค๋ฐ์ ํ๋์ ํตํฉ๋ ์ปค๋ฐ์ผ๋ก ์์ถํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. Cherry-picking Cherry-picking์ ํน์ ๋ธ๋์น์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ํ์ ์ผ๋ก ๋ค๋ฅธ ๋ธ๋์น์ ํตํฉํ ๋ ์ ์ฉํฉ๋๋ค. ์ ์ฒด ๋ธ๋์น๋ฅผ ๋ณํฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ์ง ์๊ฑฐ๋ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ํนํ ์ ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ Cherry-picking์ ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํ๋ฉฐ, ์๋ชป ์ฌ์ฉํ ๊ฒฝ์ฐ ์ค๋ณต๋ ์ปค๋ฐ๊ณผ ๋ถ๊ธฐ๋ ํ์คํ ๋ฆฌ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. Signing commits Signing commits๋ Git์์ ์ปค๋ฐ์ ์ง์์ ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. GNU Privacy Guard(GPG) ํค๋ฅผ ์ฌ์ฉํด ์ปค๋ฐ์ ์ํธํ ์๋ช ์ ์ถ๊ฐํจ์ผ๋ก์จ, ์ปค๋ฐ ์์ฑ์๊ฐ ๋ณธ์ธ์์ ๋ณด์ฅํ ์ ์์ต๋๋ค. GPG ํค๋ฅผ ์์ฑํ๊ณ Git์ด ์ปค๋ฐํ ๋ ์ด ํค๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค. Git Reflog Git references๋ Git ํ์คํ ๋ฆฌ์ ๋ช ๋ช ๋ ์ง์ ์ผ๋ก, ์ฌ์ฉ์๊ฐ ์ ์ฅ์์ ํ์๋ผ์ธ์ ํ์ํ๊ณ ํ๋ก์ ํธ์ ํน์ ์ค๋ ์ท์ ์ ๊ทผํ ์ ์๊ฒ ํฉ๋๋ค. Git references๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ผ๋ฉด ์ ์ฉํ๋ฉฐ, ์ด๋ฅผ ์ํด git reflog๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค: * ์์ด๋ฒ๋ฆฐ ์ปค๋ฐ ๋๋ ๋ธ๋์น ๋ณต๊ตฌ * ๋๋ฒ๊น ๋ฐ ๋ฌธ์ ํด๊ฒฐ * ์ค์ ์ทจ์ Interactive rebase ์ธํฐ๋ํฐ๋ธ ๋ฆฌ๋ฒ ์ด์ค๋ ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ฅผ ๋ํํ์ผ๋ก ์ฌ์์ฑํ ์ ์๋ ๊ฐ๋ ฅํ Git ๊ธฐ๋ฅ์ ๋๋ค. ์ปค๋ฐ์ ์ ์ฉํ๊ธฐ ์ ์ ์์ , ์ฌ์ ๋ ฌ, ๊ฒฐํฉ, ์ญ์ ํ ์ ์์ต๋๋ค. Origin vs Upstream origin์ ๋ก์ปฌ Git ์ ์ฅ์์ ์ฐ๊ด๋ ๊ธฐ๋ณธ ์๊ฒฉ ์ ์ฅ์์ ๋๋ค. ์ ์ฅ์๋ฅผ ๋ณต์ (clone)ํ๋ฉด ํด๋น ๋ณต์ ๋ณธ์ด ๊ธฐ๋ณธ์ ์ผ๋ก origin ์๊ฒฉ ์ ์ฅ์๋ก ์ค์ ๋ฉ๋๋ค. ์ ์ฅ์๋ฅผ ํฌํฌ(fork)ํ๋ค๋ฉด, ๊ทธ ํฌํฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก origin ์ ์ฅ์๊ฐ ๋ฉ๋๋ค. ย ๋ฐ๋ฉด, upstream์ ์ ์ฅ์๊ฐ ํฌํฌ๋ ์๋ ์ ์ฅ์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ย ํฌํฌ๋ ์ ์ฅ์๋ฅผ ์๋ ํ๋ก์ ํธ์ ์ต์ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ๋๊ธฐํํ๋ ค๋ฉด upstream ์ ์ฅ์์์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์ ธ์(git fetch) ๋ก์ปฌ ์ ์ฅ์์ ๋ณํฉ(merge)ํ๊ฑฐ๋ ๋ฆฌ๋ฒ ์ด์ค(rebase)ํด์ผ ํฉ๋๋ค. ย Conflicts ๋ธ๋์น๋ฅผ ๋ณํฉํ๊ฑฐ๋ ๋ฆฌ๋ฒ ์ด์คํ ๋ ์ถฉ๋์ด ๋ฐ์ํด๋ ๋นํฉํ์ง ๋ง์ธ์. ์ด๋ ์ ์ฅ์์ ๋์ผ ํ์ผ ๋๋ ์ฌ๋ฌ ํ์ผ์ ๋ค๋ฅธ ๋ฒ์ ์ฌ์ด์ ์ถฉ๋ํ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์์์ ์๋ฏธํ๋ฉฐ, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค. ย Feature Branch Workflow ๊ฐ ์๋ก์ด ๊ธฐ๋ฅ์ด๋ ๋ฒ๊ทธ ์์ ์ ๋ณ๋์ ๋ธ๋์น์์ ๊ฐ๋ฐ๋๊ณ ์๋ฃ๋ ํ ๋ฉ์ธ ๋ธ๋์น๋ก ๋ณํฉ๋ฉ๋๋ค. * ์ฅ์ : ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒฉ๋ฆฌ ๋ฐ ์ถฉ๋ ๊ฐ์ * ๋จ์ : ๋ณต์กํด์ง ์ ์์ผ๋ฉฐ ์ฒ ์ ํ ๋ธ๋์น ๊ด๋ฆฌ๊ฐ ํ์ Gitflow Workflow Gitflow๋ ๋ค์ํ ๊ฐ๋ฐ ์์ ์ ์ํ ์ฌ์ ์ ์๋ ๋ธ๋์น๋ฅผ ํฌํจํ๋ ์๊ฒฉํ ๋ธ๋์นญ ๋ชจ๋ธ์ ์ ์ํฉ๋๋ค. * ๋ฉ์ธ, ๊ฐ๋ฐ, ๊ธฐ๋ฅ, ๋ฆด๋ฆฌ์ค, ํซํฝ์ค ๋ธ๋์น์ ๊ฐ์ ์ฅ๊ธฐ ๋ธ๋์น๋ฅผ ํฌํจํฉ๋๋ค. * ์ฅ์ : ์ ๊ธฐ ๋ฆด๋ฆฌ์ค ๋ฐ ์ฅ๊ธฐ ์ ์ง๋ณด์๊ฐ ํ์ํ ํ๋ก์ ํธ์ ์ ํฉ * ๋จ์ : ์๊ท๋ชจ ํ์๋ ๋๋ฌด ๋ณต์กํ ์ ์์ Forking Workflow ์ด ์ํฌํ๋ก์ฐ์์๋ ๊ฐ ๊ฐ๋ฐ์๊ฐ ๋ฉ์ธ ์ ์ฅ์๋ฅผ ๋ณต์ (clone)ํ์ง๋ง, ๋ณ๊ฒฝ ์ฌํญ์ ๋ฉ์ธ ์ ์ฅ์์ ์ง์ ํธ์ํ๋ ๋์ ์์ ์ ํฌํฌ์ ํธ์ํฉ๋๋ค. ์ดํ ๋ฉ์ธ ์ ์ฅ์๋ก ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ํ๋ ํ ๋ฆฌํ์คํธ๋ฅผ ์์ฑํ์ฌ ๋ณํฉ ์ ์ ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฐ ํ์ ์ด ์ด๋ฃจ์ด์ง๋๋ค. * ์ด ์ํฌํ๋ก์ฐ๋ ์คํ ์์ค Glasskube ์ ์ฅ์์์ ํ์ ํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค. * ์ฅ์ : ์ธ๋ถ ๊ธฐ์ฌ์์ ํ์ ์ ์ฅ๋ คํ๋ฉด์ ๋ฉ์ธ ์ ์ฅ์์ ๋ํ ์ง์ ์ ์ธ ์ฐ๊ธฐ ๊ถํ ๋ถ์ฌ๋ฅผ ๋ฐฉ์ง * ๋จ์ : ํฌํฌ์ ๋ฉ์ธ ์ ์ฅ์ ๊ฐ์ ๋๊ธฐํ ์ ์ง๊ฐ ์ด๋ ค์ธ ์ ์์ Pull Request Workflow ํฌํฌ ์ํฌํ๋ก์ฐ์ ์ ์ฌํ์ง๋ง, ๊ฐ๋ฐ์๊ฐ ๋ฉ์ธ ์ ์ฅ์์ ์ง์ ๊ธฐ๋ฅ ๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค. * ์ฅ์ : ์ฝ๋ ๋ฆฌ๋ทฐ, ํ์ , ํ์ ๊ฐ์ ์ง์ ๊ณต์ ์ด์ง * ๋จ์ : ์ฌ๋์ ์์กดํ ์ฝ๋ ๋ฆฌ๋ทฐ๋ก ์ธํด ๊ฐ๋ฐ ๊ณผ์ ์์ ์ง์ฐ์ด ๋ฐ์ํ ์ ์์ Trunk-Based Development ๋น ๋ฅธ ๋ฐ๋ณต ๋ฐ ์ง์์ ๋ฐฐํฌ์ ์ง์คํ๋ ํ์ด๋ผ๋ฉด ๋ฉ์ธ ๋ธ๋์น์์ ์ง์ ๊ฐ๋ฐํ๊ณ ์์ ๋ณ๊ฒฝ ์ฌํญ์ ์์ฃผ ์ปค๋ฐํ๋ ํธ๋ ํฌ ๊ธฐ๋ฐ ๊ฐ๋ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. * ์ฅ์ : ๋น ๋ฅธ ๋ฐ๋ณต, ์ง์์ ํตํฉ, ์๊ท๋ชจ ์์ฃผ ๋ณ๊ฒฝ์ ํ๋ก๋์ ์ ๋ฐฐํฌํ๋ ๋ฐ ์ง์ค * ๋จ์ : ๋ฉ์ธ ๋ธ๋์น์ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๊ฐ๋ ฅํ ์๋ํ ํ ์คํธ ๋ฐ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ด ํ์ํ๋ฉฐ, ๋ฆด๋ฆฌ์ค ์ผ์ ์ด ์๊ฒฉํ๊ฑฐ๋ ๋ณต์กํ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ด ํ์ํ ํ๋ก์ ํธ์๋ ์ ํฉํ์ง ์์ ์ ์์ ย Git Cheatsheet ย # Clone a Repository git clone # Stage Changes for Commit git add # Commit Changes git commit -m "Commit message" # Push Changes to the Remote Repository git push # Force Push Changes (use with caution) git push --force # Reset Working Directory to Last Commit git reset --hard # Create a New Branch git branch # Switch to a Different Branch git checkout # Merge Changes from Another Branch git merge # Rebase Changes onto Another Branch (use with caution) git rebase # View Status of Working Directory git status # View Commit History git log # Undo Last Commit (use with caution) git reset --soft HEAD^ # Discard Changes in Working Directory git restore # Retrieve Lost Commit References git reflog # Interactive Rebase to Rearrange Commits git rebase --interactive HEAD~3 ย ๋ฒ์ญ: [https://ducktopia.tistory.com/134] ์๋ฌธ: