Git & Github/Git

Git - cherry-pick

pakms980319 2025. 5. 2. 18:28

๐Ÿ’ 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, ์ผ๋ถ€ ๊ธฐ๋Šฅ๋งŒ ์ ์šฉ, ์ปค๋ฐ‹ ์žฌ์‚ฌ์šฉ ๋“ฑ์— ์ฃผ๋กœ ํ™œ์šฉ๋จ
  • ์ถฉ๋Œ์ด ๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๊ณผ ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ์— ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•จ