๐ cherry-pick์ด๋?
ํน์ ๋ธ๋์น์ ์๋ ์ปค๋ฐ ํ๋ ๋๋ ์ฌ๋ฌ ๊ฐ๋ฅผ ํ์ฌ ๋ธ๋์น๋ก "์ ํ์ ์ผ๋ก" ๋ณต์ฌํด์ค๋ Git ๋ช ๋ น์ด.
- merge, rebase๋ ๋ธ๋์น ๋จ์๋ก ํ์คํ ๋ฆฌ๋ฅผ ํฉ์น๋ ๋ฐฉ์์ด๋ผ๋ฉด,
- cherry-pick์ ํน์ ์ปค๋ฐ๋ง ๊ณจ๋ผ ์ ์ฉํ๋ ๋ฐฉ์
โ๏ธ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
git cherry-pick <์ปค๋ฐํด์>
์: feature/login ๋ธ๋์น์ ์๋ ์ปค๋ฐ์ main ๋ธ๋์น์ ๊ฐ์ ธ์ค๊ณ ์ถ์ ๋
git checkout main
git cherry-pick 1a2b3c4
→ ํด๋น ์ปค๋ฐ์ด main ๋ธ๋์น์ ์๋ก์ด ์ปค๋ฐ์ผ๋ก ๋ณต์ฌ๋จ.
๐งช ์ค์ต ์์ (Windows ํ๊ฒฝ)
๋ช ๋ น์ด๋ Git Bash ๋๋ VS Code ํฐ๋ฏธ๋(cmd/powershell/git bash)์์ ์คํ
โ 1. ํ๋ก์ ํธ ์ด๊ธฐํ
mkdir cherry-pick-demo && cd cherry-pick-demo
git init
echo Hello > file.txt
git add . && git commit -m "Initial commit"
โ 2. ๋ธ๋์น ์์ฑ ๋ฐ ์ปค๋ฐ ์ถ๊ฐ
git checkout -b feature
echo "Login feature" >> file.txt
git add . && git commit -m "Add login feature"
โ 3. main์ผ๋ก ๋์๊ฐ cherry-pick ์ํ
git log --oneline # feature ๋ธ๋์น์์ ์ปค๋ฐ ํด์ ํ์ธ ํ
git checkout main
git cherry-pick <๋ก๊ทธ์ธ ์ปค๋ฐ ํด์>
๐ ํ์ธ
cat file.txt
→ “Login feature” ๋ด์ฉ์ด main์๋ ์ถ๊ฐ๋์ด ์์
๐ ํ์ธ2
git log --oneline # ๋ณต์ฌํ ์ปค๋ฐ์ ํด์๊ฐ์ด ๋ฌ๋ผ์ ธ์๋๊ฒ์ ํ์ธ ๊ฐ๋ฅ
๐ก ์ค๋ฌด์์ ์์ฃผ ์ฐ๋ ์ํฉ
โ 1. ๊ธด๊ธ ์์ (Hotfix) ๋ฐฑํฌํ
git checkout release/1.0
git cherry-pick <bugfix-commit>
โ 2. ํน์ ๊ธฐ๋ฅ๋ง ์ ๋ณ ์ ์ฉ
git checkout main
git cherry-pick <๊ธฐ๋ฅ์ปค๋ฐ1> <๊ธฐ๋ฅ์ปค๋ฐ2>
โ 3. ์ธ๋ถ ์ฝ๋ ์ฌํ์ฉ
git cherry-pick <๋ค๋ฅธ๋ธ๋์น-์ปค๋ฐ>
โ 4. ๋์ค์ ๋ณํฉํ๋ คํ ๋ ์ถฉ๋ ์ฃผ์
- ๋ฏธ๋ฆฌ ๋ณต์ฌ ํ์ฌ ์ ์ฉ์์ผฐ๋ ์ปค๋ฐ์ด ๋ธ๋์น ๋ณํฉ๋ ๋ค์ ๋ค์ด๊ฐ๊ฒ ๋๋ฉด์ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์
โ ๏ธ cherry-pick ์ฃผ์์ฌํญ
- ์ปค๋ฐ ๋ด์ฉ์ ๊ฐ์๋ ์๋ก์ด ํด์๊ฐ ์์ฑ๋จ (๋ณต์ ์ปค๋ฐ)
- ์ถฉ๋(conflict) ๋ฐ์ ์ ์๋ ํด๊ฒฐ ํ์
- ๋๋ฌด ์์ฃผ ์ฌ์ฉํ๋ฉด ํ์คํ ๋ฆฌ ํ์ ์ด ์ด๋ ค์ธ ์ ์์
git cherry-pick --continue # ์ถฉ๋ ํด๊ฒฐ ํ ์งํ
๐ ์ฌ๋ฌ ์ปค๋ฐ ํ๋ฒ์
git cherry-pick ํด์1 ํด์2
git cherry-pick A..B # A ์ดํ๋ถํฐ B๊น์ง (A๋ ํฌํจ๋์ง ์์)
๐ฅ cherry-pick ์ถฉ๋ ์ค์ต ์์ (Windows)
1. ์ด๊ธฐํ
mkdir cherry-conflict && cd cherry-conflict
git init
echo "Hello" > file.txt
git add . && git commit -m "init"
2. ๋ธ๋์น ๋ ๊ฐ ์์ฑ
git checkout -b feature-A
echo "Feature A line" >> file.txt
git add . && git commit -m "feat: add A"
git checkout main
git checkout -b feature-B
echo "Feature B line" >> file.txt
git add . && git commit -m "feat: add B"
3. cherry-pick (์ถฉ๋ ๋ฐ์)
git switch feature-A
git log --oneline # feat: add A ์ปค๋ฐ ํด์ ๋ณต์ฌ
git switch main
git cherry-pick <<feature-A Hash>>
git switch feature-B
git log --oneline # feat: add B ์ปค๋ฐ ํด์ ๋ณต์ฌ
git checkout main
git cherry-pick <<feature-B Hash>> # ์ถฉ๋ ๋ฐ์
4. ์ถฉ๋ ํ์ธ & ํด๊ฒฐ
cat file.txt
# ์ถฉ๋ ๋ง์ปค(<<<<, ====, >>>>)๊ฐ ์๊น
# ์๋์ผ๋ก ์์ ํ
git add file.txt
git cherry-pick --continue
โ ๋ง๋ฌด๋ฆฌ ์ ๋ฆฌ
- cherry-pick์ ํน์ ์ปค๋ฐ๋ง ํ์ํ ๋ธ๋์น๋ก ์ ๋ณ ์ ์ฉํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ
- ์ค๋ฌด์์๋ hotfix, ์ผ๋ถ ๊ธฐ๋ฅ๋ง ์ ์ฉ, ์ปค๋ฐ ์ฌ์ฌ์ฉ ๋ฑ์ ์ฃผ๋ก ํ์ฉ๋จ
- ์ถฉ๋์ด ๋ ์ ์๋ค๋ ์ ๊ณผ ํ์คํ ๋ฆฌ ๊ด๋ฆฌ์ ์ฃผ์๊ฐ ํ์ํจ
'Git & Github > Git' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Git - Draft (๊นํ๋ธ ๊ธฐ๋ฅ, ๊ธ ์์ฑ ํ์ ๊ธ๋ง ์จ๋ ) (0) | 2025.05.06 |
---|---|
Github - PR(Pull Request) ์ฌ๋ ค์ฃผ์ธ์ (0) | 2025.05.06 |
Interactive rebase์์ ์ต์ด ์ปค๋ฐ์ ์์ ํ ์ ์๋๊ฐ? (0) | 2025.05.02 |
Git ์ด๊ธฐ ํ๋ก์ ํธ push ์๋ฌ ๊ธฐ๋ก (0) | 2024.05.19 |
git push 403 ์๋ฌ (0) | 2024.04.24 |