상황
팀 프로젝트를 진행하면서 패키지 경로를 변경한 후 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 명령어를 단순히 사용하는 것보다 각 명령어가 어떤 대상을 다루는지 이해하는 것이 더 중요하다는 점을 다시 한번 느끼게 되었다.
'개발일지 > Project Log' 카테고리의 다른 글
| 🤦🏻♀️ 메서드가 몇 개 없는데도 공통 메서드를 분리해야 할까? (0) | 2026.07.16 |
|---|---|
| [Design] JPQL UPDATE 사용 시 findById()를 먼저 조회하는 이유 (0) | 2026.05.18 |
| [Study] JPQL에서 : 파라미터문법은 무엇일까? (0) | 2026.05.13 |
| [Performance] JPA N+1 문제 해결 과정 (0) | 2026.05.12 |