โ ์ฝ๋์ ๋ฏธํ์ ์ค์ค๋ก ํฐ๋ํ ์๋ ์์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค๋ ์ฝ๊ฒ ๋ฐฐ์ธ ์ ์์ผ๋ฆฌ๋ผ ์ฐฉ๊ฐํ์ง ๋ง๋ผ. โ
- ๊ฐ๋ฐ์ ์๋ด(Programmerโs Proverbs)

์ํ๋ commit ๊ฐ์ ธ์ค๊ธฐ
git์ ์ด์ฉํด ์ฝ๋ ๊ด๋ฆฌ๋ฅผ ํ๋ค๋ณด๋ฉด ์ปค๋ฐ์ ๋ค๋ฅธ ๋ธ๋์น์ ์๋ชป ํ๊ฑฐ๋, ์๊ตฌ์ฌํญ์ด ๋ฐ๋์ด ํ์ ์๋ ์ปค๋ฐ์ด ์๊ธฐ๊ฑฐ๋, ์ฝ๋ ์์กด์ฑ(dependency) ๋๋ฌธ์ ๋ค๋ฅธ ์ฌ๋์ ์ปค๋ฐ ์ค ์ผ๋ถ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์๊ธด๋ค.
์ด๋ ์ฌ์ฉํ ์ ์๋ ๋ช ๋ น์ด๊ฐ cherry-pick ์ด๋ค.
git cherry-pick
git cherry-pick ๋ช ๋ น์ด๋ ํน์ ํ commit ํ๋๋ง ์ฝ ์ฐ์ด์ ํ์ฌ HEAD๊ฐ ๊ฐ๋ฆฌํค๋ branch์ ์ถ๊ฐํ ์ ์๊ฒ ํด์ค๋ค.
์ฝ๊ฒ ๋งํด์ ๋ค๋ฅธ branch์ ์๋ ์ฌ๋ฌ๊ฐ์ commit๋ค ์ค, ์ํ๋ commit์ ์ง๊ธ ๋ด branch์ ๊ฐ์ ธ์์ commit ํ ์ ์๋ ๊ฒ์ด๋ค.
cherry pick์ด๋, ์ฒด๋ฆฌ ํ ๋ฐ๊ตฌ๋์์ ์ ์ผ ์ข์ ์ฒด๋ฆฌ๋ง ๊ณ ๋ฅด๋ ๊ฒ์์ ์ ๋ํ ํํ์ด๋ผ๊ณ ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก๋ ์ ์ผ ์ข์ ๊ฑธ ์ ๋ณํ๋ค๋ ๋ป์ผ๋ก ์ฐ์ธ๋ค.
์ฐธ๊ณ ๋ก commit์ branch์์ ๋ค๋ฅธ branch๋ก ์ฎ๊ธฐ๋ ๊ฑด ์๋๊ณ , ์ ์ฒด history๋ฅผ ๋ฐ์ง๋ฉด ์๋ก์ด commit์ด ๋์ด๋๋ ๊ฒ์ด๋ค.
๐ก cherry-pick์ ์ธ์ ์จ์ผ ํ ๊น?
์ ์ฉํ๊ธด ํ์ง๋ง cherry-pick์ด ํญ์ ๊ถ์ฅ๋๋ ๊ฒ์ ์๋๋ผ๊ณ ํ๋ค.
๊ฐ์ commit์ด ์ฌ๋ฌ ๋ฒ ์์ด๋ ์ผ๋ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ cherry-picking์ด ๊ฐ๋ฅํ ์ํฉ์์ ๋ณดํต์ ์ผ๋ฐ์ ์ธ merge๋ฅผ ์ฌ์ฉํ๋ ๊ฑธ ์ ํธํ๋ค๊ณ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด cherry-pick์ ์ด๋ค ์ํฉ์์ ์ ์ฉํ ๊น?
[ํ์ผ๋ก ํ์ ํ ๋]
๋ง์ผ ํ์ด๋ ์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ ์๋ค๊ณ ํ์.
๋ณธ์ธ๋ ๋ฐฑ์๋๋ค. ํ์ฌ ๋ด๊ฐ ๋งก์ ๊ธฐ๋ฅ์ด ํ๋ก ํธ๊น์ง ๋ํด์ก์ ๋ ์ด๋ป๊ฒ ๋์๊ฐ๋์ง ํ์ธํ๊ณ ์ถ์๋ฐ ํ๋ก ํธ์๋๋ฅผ ๋งก์ ๋๋ฃ๊ฐ ์ง๊ธ ํ์ฐฝ ์์ ์ค์ด๋ผ๊ณ ํ๋ค. ๊ทผ๋ฐ ์๊น CSS ํ์ผ์ ์์ฑํด์ commitํด ๋๋ค๊ณ ํ๋ค.
๊ทธ๋ผ cherry-pick์ ํตํด ๊ทธ commit ํ๋๋ง ์ฐพ์์ ๋ด branch์ ๊ฐ์ ธ์ค๋ฉด ๋๋ค.
CSS๋ง ์ ํ๋ณผ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
[๋ฒ๊ทธ ์์ ]
๋ณธ์ธ์ ๋ฉฐ์น ์ A ๊ธฐ๋ฅ์ ์์ฑํ ๊ฐ๋ฐ์๋ค.
A๊ฐ ๋๋๊ณ B ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ ์ค์ด์๋๋ฐ, ์๊ณ ๋ณด๋ A ๊ธฐ๋ฅ์ ๋ฒ๊ทธ๊ฐ ์๋ค๊ณ ํ๋ค.
๋ ๋ง์ ์ ์ ๋ค์ด ์ด ๋ฒ๊ทธ๋ก ์ธํ ํ์์ ๊ฒช๊ธฐ ์ ์ ๋น ๋ฅด๊ฒ ๋ฒ๊ทธ ํจ์น๋ฅผ ํด์ ๋ด branch์ commitํ๋ค.
๋ฐฉ๊ธ commitํ ์ด ํจ์น๋ git cherry-pick์ ํตํด main branch์ ๋ฐ๋ก ๋ฐ์๋์๋ค.
[๋ฐ์๋์ง ์์ pr]
์ค์๋ก pull request๋ฅผ mergeํ๊ธฐ ์ ์ ๋ซ์๋ฒ๋ ธ๋ค.
๋นํฉํ์ง ์๊ณ git cherry-pick์ ํตํด ํด๋น commit์ ๊ฐ์ ธ์ด์ผ๋ก์จ ์ด๋ฆด ์ ์๊ฒ ๋๋ค.
$ git cherry-pick <commit์ฌ์ฏ์๋ฆฌ๋ฒํธ>

์๋ฅผ๋ค์ด, ์ ์ฒ๋ผ ํ์ฌ ๋น์ ์ ์ฝ๋๋ X ๋ธ๋์น์ ์๊ณ
๋น์ ์ ๋ธ๋์น Y์ ์ปค๋ฐ ์ค 76ae30ef์ 13af32cc๋ง ๊ณจ๋ผ ํ์ฌ ๋ธ๋์น์ธ X์ ์ ์ฉํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํ์.
# ํ๋์ฉ ํด๋ ๋๊ณ
$ git cherry-pick 76ae30ef
$ git cherry-pick 13af332cc
# ์ธ๋ผ์ธ์ผ๋ก ํ๊บผ๋ฒ์ ํด๋ ๋๋ค.
$ git cherry-pick 76ae30ef 13af32cc
์ฒด๋ฆฌ ํฝ์ ํ์ฌ ๋ธ๋์น X์ ์ ์ฉํ๋ฉด, ์ด์ ์ปค๋ฐ ์์ ์ฌํญ์ด X๋ธ๋์น์ ์ ์ฉ๋๋ค.
๋ฌผ๋ก ๊ฒน์น๋ ๋ด์ฉ์ด ์์ผ๋ฉด ๋น์ฐํ conflict๊ฐ ์ผ์ด๋๊ณ , ์์ ํ ์๋ก ์ปค๋ฐํด์ผ ํ๋ค.

git cherry-pick โcontinue / โabort
๊ฐ๋ cherry-pickํ๋ ค๋ ์ปค๋ฐ๊ณผ ๋ด ๋ธ๋์น ์ฌ์ด์ conflict์ด ๋ฐ์ ํ ์์๋ค.
๊ทธ๋ฐ ๊ฒฝ์ฐ ๋ ๊ฐ์ง ์ต์ ์ด ์๋ค.
โญ Conflict๋ฅผ ํด๊ฒฐํ๊ณ cherry-pick์ ์งํ์ํจ๋ค.
- Conflict์ ํด๊ฒฐํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์์ ํ๋ค.
- git add <path> ๋ช ๋ น์ด๋ก ์์ ๋ ์ฝ๋๋ฅผ ์ฌ๋ฆฐ๋ค. (์ปค๋ฐ์ ๋ค์ ํ ํ์ ์๋ค.)
- git cherry-pick โcontinue ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ ์งํ์ด ์์ ๋๋ค.
โญ cherry-pick์ ์ค๋จํ๋ค.
- git cherry-pick โabort ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด cherry-pick์ ์ค๋จํ๋ฉด, cherry-pick์ ํ๊ธฐ ์ ์ํ๋ก ๋์ ๊ฐ ์ ์๋ค.
git cherry-pick merge
๋ง์ฝ merge commit์ cherry-pickํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค
$ git cherry-pick -m 1 <merge_commit_hash>
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.