[내일배움캠프_사전캠프_8기]_Days_15 TIL_ 팀 프로젝트-Day7

2026. 7. 10. 15:55부트캠프/TIL(Today I Learned)

Git Cherry-pick과 Merge Conflict 해결기 (SecurityConfig 충돌)

팀 프로젝트를 진행하면서 리뷰 CRUD와 사장 리뷰 답글 기능을 구현한 후 PR을 생성했는데, CI가 실패하면서 기존 브랜치가 최신 develop 브랜치와 충돌하는 상황이 발생했다.

이번 글에서는 왜 충돌이 발생했는지, 어떻게 해결했는지, 그리고 사용한 Git 명령어를 정리해보려고 한다.

 

 


 

문제 발생

리뷰 기능을 구현한 후 PR을 생성했지만 CI가 실패하였다.

기존 브랜치는 오래된 develop 브랜치를 기준으로 작업을 진행했기 때문에, 현재 팀원들이 작업한 최신 develop과 많은 차이가 발생한 상태였다.

SecurityConfig는 여러 도메인의 인증 및 권한 설정이 계속 추가되는 파일이라 팀원들의 변경사항이 많이 반영되어 있었다.

그 상태에서 내가 추가한 리뷰 권한 설정까지 함께 존재하면서 Git은 어느 코드를 유지해야 하는지 판단하지 못했고 Merge Conflict가 발생하였다.

 

 

 


충돌이 발생한 이유

기존 브랜치의 SecurityConfig

 
.requestMatchers(HttpMethod.GET, "/api/reviews/*").permitAll()
.requestMatchers(HttpMethod.GET, "/api/stores/*/reviews").permitAll()
.requestMatchers("/api/reviews/**").authenticated()
 

최신 develop의 SecurityConfig

 
.requestMatchers("/api/auth/**").permitAll()

// Payment
.requestMatchers("/api/orders/**").permitAll()

// Store
// Menu
// OrderManagement
 

최신 develop에서는 다른 팀원들이 여러 도메인의 권한 설정을 추가하고 있었고,

나는 리뷰 기능에 대한 권한 설정을 추가했기 때문에 같은 위치를 수정하여 충돌이 발생하였다.

Git은 자동으로 병합하지 못하고 아래와 같이 충돌 표시를 남겼다.

<<<<<<< HEAD
최신 develop 코드
=======
내가 작성한 리뷰 권한 코드
>>>>>>> 9715e63

 

 

 


 

 

 

 

해결 방법

1. 최신 develop 가져오기

먼저 최신 develop을 가져왔다.

 
git fetch origin

 

 

2. 최신 develop 기준으로 브랜치 생성

 
git checkout develop
git reset --hard origin/develop

git checkout -b 89-feat-review
 

최신 develop을 기준으로 새로운 작업 브랜치를 생성하였다.

 

 

3. 기존 작업 가져오기

기존 커밋만 가져오기 위해 Cherry-pick을 사용하였다.

 
git cherry-pick 9715e63
 

하지만 여기서 Merge Conflict가 발생하였다.

CONFLICT (content):
SecurityConfig.java

 

 

 

Merge Conflict 해결

VS Code에서 SecurityConfig.java를 열면 아래와 같은 충돌 표시가 나타났다.

 
<<<<<<< HEAD
최신 develop 코드
=======
내가 작성한 리뷰 권한 코드
>>>>>>> 9715e63
 

 

최신 develop의 변경사항은 유지하면서 내가 구현한 리뷰 권한도 함께 추가하는 것이었다.

 

 
.requestMatchers("/api/auth/**").permitAll()

.requestMatchers("/api/orders/**").permitAll()

.requestMatchers(HttpMethod.GET, "/api/reviews/*").permitAll()
.requestMatchers(HttpMethod.GET, "/api/stores/*/reviews").permitAll()
.requestMatchers("/api/reviews/**").authenticated()

.anyRequest().permitAll()
 

처럼 두 내용을 모두 반영하였다.

 

 


 

 

충돌 해결 완료

충돌을 해결한 후에는 Git에게 충돌이 해결되었음을 알려주어야 한다.

 
git add src/main/java/com/sparta/server/threeserving/global/config/SecurityConfig.java
 

이후 Cherry-pick을 계속 진행하였다.

 
git cherry-pick --continue
 

Vim 편집기가 열리면 기본 커밋 메시지를 그대로 저장하고 종료하였다.

Esc
:wq
Enter

 

 

 

새로운 브랜치 Push

작업이 끝난 후 새로운 브랜치를 Push하였다.

 
git push -u origin 89-feat-review
 

그리고 최신 develop을 기준으로 다시 PR을 생성하였다.

 

 

사용한 Git 명령어

 
# 최신 원격 저장소 정보 가져오기
git fetch origin

# develop 이동
git checkout develop

# 최신 develop으로 맞추기
git reset --hard origin/develop

# 새 브랜치 생성
git checkout -b 89-feat-review

# 기존 작업 가져오기
git cherry-pick <commit-id>

# 충돌 해결 후
git add .
git cherry-pick --continue

# 원격 저장소 Push
git push -u origin 89-feat-review

# 잘못 생성한 원격 브랜치 삭제
git push origin --delete <branch-name>

# 로컬 브랜치 삭제
git branch -D <branch-name>

 

 


 

마무리

이번 경험을 통해 Merge Conflict는 서로의 변경사항을 비교하여 필요한 내용을 모두 반영하는 과정이라는 것이라는 것을 알게되었다.

 

SecurityConfig처럼 여러 팀원이 동시에 수정하는 파일은 충돌이 발생하기 쉬운 영역이다. 팀 프로젝트에서는 새로운 기능을 개발하기 전에 항상 최신 develop 브랜치를 먼저 반영한 후 작업 브랜치를 생성하는 습관을 가져야 충돌을 최소화할 수 있다는 점을 알게되었다.

 

 

내일 할일

유저 도메인의 남은 기능을 구현하여 기능 개발 및 제 역할의 마무리를 할 예정이다. 구현이 완료되면 예외 처리와 전체 기능에 대한 테스트를 진행하며 검증하고, JUnit 5 테스트 코드 작성 방법을 실습하여 프로젝트에도 테스트 코드를 적용해 볼 계획이다.


그리고 다음 주 팀원들과 진행할 것

다음 주에는 프로젝트 발표를 대비하여 팀원들과 함께 기능별 테스트 및 검증을 진행하고, API 명세와 주요 기능, 트러블 슈팅 내용을 정리하는 발표 문서를 작성할 예정이다. 또한 구현한 기능들을 다시 한번 점검하며 예상 질문에 대비하고, 코드 리팩토링과 최종 수정 사항을 반영하여 프로젝트의 완성도를 높일 계획이다.