개발일지/Project Log

Git Cherry-pick이란? Staging Area에서 파일을 선택하는 것과 무엇이 다를까?

기억지기 개발자 2026. 7. 15. 15:46

상황

팀 프로젝트를 진행하면서 패키지 경로를 변경한 후 main 브랜치와 Merge하는 과정에서 충돌이 발생했다.

충돌을 해결하는 방법을 찾아보던 중 Cherry-pick이라는 기능을 처음 접하게 되었다.

설명을 읽어보니 “원하는 것만 가져온다.“는 점에서 문득 이런 의문이 들었다.

“아직 커밋되지 않은 내 작업 공간(Workspace)에서 필요한 파일만 골라서 Staging Area에 올리는 것과 Cherry-pick은 무엇이 다를까?”

처음에는 둘 다 “원하는 것만 선택한다.“는 공통점이 있기 때문에 비슷한 기능이라고 생각했다.

하지만 공부해 보니 두 기능은 다루는 대상 자체가 완전히 달랐다.


Staging Area는 ‘파일’을 선택하는 기능이다.

우리가 가장 많이 사용하는 Git 명령어는 git add이다.

git add UserService.java

또는

git add .

이 명령어는 현재 내 컴퓨터에서 수정한 파일을 선택하여 Staging Area에 올리는 역할을 한다.

즉,

Workspace
        ↓ git add
Staging Area
        ↓ git commit
Repository

아직 커밋되지 않은 변경 사항을 대상으로 작업하는 것이다.

다시 말해 git add파일 단위의 선택이라고 볼 수 있다.


Cherry-pick은 ‘커밋’을 선택하는 기능이다.

반면 Cherry-pick은 대상이 다르다.

이미 누군가가 완료한 커밋 하나를 선택하여 현재 브랜치로 가져오는 기능이다.

예를 들어 다음과 같은 브랜치가 있다고 가정해 보자.

main

A ─── B ─── C

feature

A ─── B ─── D

여기서 feature 브랜치의 D 커밋만 현재 브랜치에 적용하고 싶다면

git cherry-pick D

를 실행한다.

그러면 현재 브랜치에는

main

A ─── B ─── C ─── D'

처럼 D의 변경 내용만 새로운 커밋으로 적용된다.

여기서 중요한 점은 커밋 자체를 복사하는 것이 아니라, 해당 커밋의 변경 내용을 현재 브랜치에 새로운 커밋으로 적용한다는 것이다.


둘의 가장 큰 차이

처음에는 둘 다 “필요한 것만 가져온다.“는 점에서 비슷해 보였다.

하지만 실제로는 선택하는 대상이 완전히 다르다.

구분 git add git cherry-pick
대상 아직 커밋되지 않은 파일 이미 커밋된 변경 이력
작업 위치 내 Workspace 다른 브랜치 또는 현재 저장소의 커밋
선택 단위 파일(또는 변경 내용) 커밋
목적 커밋 준비 특정 커밋만 다른 브랜치에 적용

즉,

  • git add는 파일을 선택하는 기능
  • git cherry-pick은 커밋을 선택하는 기능

이라는 차이가 있다.


Cherry-pick은 언제 사용할까?

Cherry-pick은 특정 기능이나 버그 수정만 가져오고 싶을 때 유용하다.

예를 들어 feature/payment 브랜치에는 여러 개의 커밋이 있는데, 그중 버그 수정 커밋 하나만 main에도 바로 반영해야 하는 상황이 있을 수 있다.

이때 Merge를 하면 필요하지 않은 다른 작업까지 함께 들어온다.

반면 Cherry-pick을 사용하면 원하는 커밋 하나만 선택해서 가져올 수 있다.

그래서 다음과 같은 상황에서 자주 사용된다.

  • 긴급 버그 수정(Hotfix)을 다른 브랜치에도 적용해야 할 때
  • 다른 브랜치의 특정 기능만 가져오고 싶을 때
  • Merge 없이 필요한 커밋만 선택적으로 반영하고 싶을 때

정리

git add아직 커밋되지 않은 파일을 선택하는 기능이고, git cherry-pick이미 완료된 커밋을 선택하여 현재 브랜치에 적용하는 기능이다.

둘 다 “원하는 것만 가져온다.“는 공통점은 있지만, 하나는 파일, 다른 하나는 커밋을 대상으로 한다는 점에서 목적과 사용 시점이 명확하게 구분된다.

이번 경험을 통해 Git 명령어를 단순히 사용하는 것보다 각 명령어가 어떤 대상을 다루는지 이해하는 것이 더 중요하다는 점을 다시 한번 느끼게 되었다.