본문 바로가기
잡(job)기술

SVN Merge 실수 줄이는 법: 체리픽부터 mergeinfo까지 실전 전략 5가지

by 무니이구나 2026. 2. 11.

한 줄 요약

SVN 머지는 “명령어 실행”이 아니라 “리스크 관리 작업”이다. 체리픽, 역방향 머지, 충돌 해결, mergeinfo 이해만 제대로 해도 사고 확률이 급격히 줄어든다.


들어가며

혹시 이런 경험 있지 않은가?

  • 급하게 버그 하나만 trunk에 반영하려다 전체 브랜치가 섞여버림
  • 잘못 머지해서 팀원 코드까지 꼬임
  • C 표시 뜨는 순간 식은땀이 남
  • svn:mergeinfo가 남아서 찝찝함

SVN 머지는 단순히 코드를 합치는 작업이 아니다. 프로젝트 히스토리를 “안전하게 제어”하는 작업이다.

오늘은 실무에서 바로 써먹을 수 있는 SVN 머지 전략을 정리해보자. 이 글을 다 읽으면 최소한 “머지하다 사고 나는 일”은 크게 줄어든다.

오늘 해결할 목표

  • 체리픽을 정확히 이해한다
  • 역방향 머지를 안전하게 사용한다
  • 머지 전에 반드시 점검해야 할 체크리스트를 익힌다
  • 충돌이 났을 때 침착하게 처리한다
  • svn:mergeinfo의 역할을 이해한다

사전 준비물

  • SVN 1.5 이상
  • trunk / branches 구조가 있는 저장소
  • 기본 명령어 사용 가능 (svn merge, svn status, svn info 등)

핵심 개념 쉽게 이해하기

1️⃣ 리비전(Revision)이란?

SVN에서 하나의 커밋 번호를 의미한다.
예: r19458 → 저장소에 기록된 변경 단위.

 

2️⃣ 체리픽이란?

특정 리비전 하나의 변경사항만 가져오는 것.

“브랜치 전체는 필요 없고, 이 버그 수정 하나만 필요해”

→ 이럴 때 쓰는 기술이다.

 

3️⃣ 역방향 머지란?

이미 반영된 리비전을 “취소”하는 머지. Git의 revert와 비슷한 개념이다.

 

4️⃣ mergeinfo란?

SVN이 “어떤 리비전이 이미 병합됐는지” 기록하는 속성이다. 중복 머지를 방지하는 안전장치다.


단계별 따라하기

Step 1. 체리픽 정확히 이해하고 사용하기

예: 브랜치의 r19458만 trunk에 반영하고 싶다.

먼저 trunk 워킹카피로 이동한다.

svn info

 

URL이 /trunk인지 반드시 확인한다.

그 다음 실행:

svn merge -c 19458 ^/branches/feature-branch

왜 -c를 써야 하는가?

-c 19458은 내부적으로 다음과 같다:

-r 19457:19458

 

즉, “19458에서 발생한 변화량만” 가져온다.

 

❌ 많이 하는 실수:

svn merge -r 19458 ...

 

이건 단일 리비전 적용이 아니다. 반드시 -c를 사용해야 한다.

 

Step 2. 잘못 머지했을 때 되돌리기 (Reverse Merge)

이미 trunk에 r19458을 잘못 반영했다면?

svn merge -c -19458 ^/branches/feature-branch

 

리비전 앞에 -를 붙이면 된다. 이건 “19458의 변경을 거꾸로 적용”한다는 의미다.

⚠ 반드시 trunk 워킹카피에서 실행해야 한다.

머지 후:

svn diff

 

의도대로 되돌아갔는지 반드시 확인하자.

 

Step 3. 머지 전에 반드시 확인할 것

❌ 브랜치 위치에서 머지하지 말 것

브랜치 디렉토리에서 머지를 실행하면 trunk 변경이 브랜치로 들어간다. 대형 사고다.

✅ 항상 위치 확인

svn info

 

URL 확인.

필요하면:

svn switch ^/trunk

 

 

Step 4. 충돌(C) 해결 절차

머지 후:

svn status
C file.cpp

 

이건 SVN이 “자동 병합 불가”라고 알려주는 것이다.

 

1단계: 내용 확인

svn diff file.cpp

 

충돌 마커:

<<<<<<< .working
내 코드
=======
브랜치 코드
>>>>>>> .merge-right.r19458

 

 

2단계: 해결 방식 선택

옵션 의미
working 직접 수정 후 해결
mine-full 내 코드 유지
theirs-full 상대 코드 유지

 

예:

svn resolve --accept working file.cpp

 

충돌 해결 후 반드시:

svn status

 

C가 사라졌는지 확인한다.

 

Step 5. svn:mergeinfo 이해하기

머지 후 다음을 실행해보자:

svn propget svn:mergeinfo .

 

예시 출력:

/branches/feature-branch:19458

 

이건 “19458은 이미 병합됨”이라는 기록이다.

왜 중요한가?

  • 중복 머지 방지
  • 협업 시 병합 충돌 감소
  • 히스토리 추적 가능

브랜치를 삭제해도 mergeinfo는 기록으로 남는다. 왜냐하면 “과거에 병합했다”는 사실은 프로젝트 이력의 일부이기 때문이다.


전체 예제 명령어 정리

# trunk 위치 확인
svn info

# 체리픽
svn merge -c 19458 ^/branches/feature-branch

# 역방향 머지
svn merge -c -19458 ^/branches/feature-branch

# 충돌 확인
svn status

# 충돌 해결
svn resolve --accept working file.cpp

# mergeinfo 확인
svn propget svn:mergeinfo .

 


실무에서 쓰는 팁

🔹 머지 전 항상 clean 상태 유지

svn status

 

수정 파일이 남아있으면 커밋 후 진행.

 

🔹 머지는 작은 단위로

한 번에 여러 리비전 몰아서 머지하지 말 것. 문제 발생 시 추적이 어렵다.

 

🔹 merge 후 diff 검증은 필수

svn diff

 

눈으로 검증하는 습관이 사고를 막는다.


마무리

SVN 머지는 “합친다”가 아니라 “통제한다”에 가깝다.

  • 필요한 것만 정확히 가져오고
  • 잘못되면 되돌릴 수 있어야 하며
  • 시스템이 기록하는 이력을 이해해야 한다

다음 머지에서 가장 먼저 할 일은 무엇일까? 아마 svn info일 것이다. 이 작은 습관 하나가 대형 사고를 막는다.