[Git] 브랜치 간 변동 사항을 옮길 때 주의할 점

2026. 4. 6. 17:04 · 개발자로 살아남기/트러블슈팅

: develop → gov 브랜치 반영 과정에서 겪은 함정과 해결법

상황

develop 브랜치에서 조직도 기능을 개발했고, 이걸 gov 브랜치에 반영해야 했다. cherry-pick 하기 편하게 gov 기반으로 새 브랜치를 만들고 파일만 가져오기로 했다.

git checkout gov
git checkout -b feature/feat-org-page
git checkout develop -- src/public/pages/serviceUsersManagement.vue

간단해 보였다.

 

 

 

함정 1 — 기능과 무관한 변경이 딸려온다

git checkout branch -- file은 해당 파일의 브랜치 최신 상태 전체를 가져온다. 조직도 변경만 원했는데, develop에서 별도로 진행된 변경까지 모두 딸려왔다.

- import GlobalAlarm from "@/js/common/globalAlarm.js";
- import Menu from "@/components/common/menu.vue";

develop에서는 이미 GlobalAlarm과 Menu를 제거한 상태였다. 하지만 gov에서는 아직 사용 중이었고, 결과적으로 사이드바 메뉴가 통째로 사라졌다.

 

 

함정 2 — API 파일

memberRequest.js에도 같은 문제가 있었다.

추가해야 할 것

  • requestOrganizations
  • requestOrgMembers
  • requestEgovLink

딸려오는 것

  • requestLoginForPWA 삭제
  • requestSetPassword 시그니처 변경

통째로 가져오면 gov에서 아직 쓰고 있는 함수가 사라진다.

 

 

해결 방법

1. 새 파일은 통째로 가져와도 된다

gov에 없던 파일은 충돌 가능성이 없다.

git checkout develop -- src/public/components/serviceUsersManagement/modal/ModalEgovLink.vue
git checkout develop -- src/public/components/serviceUsersManagement/CustomLoadingOverlay.ts
git checkout develop -- src/public/assets/css/orgChartMode.css

 

 

2. 기존 파일은 diff를 먼저 확인한다

git diff gov develop -- src/public/api/memberRequest.js

여기서 조직도와 무관한 변경을 식별하고, 해당 파일은 통째로 가져오지 않는다.

 

 

3. 혼합된 파일은 수동으로 필요한 부분만 추가한다

gov 버전을 유지한 채로 필요한 함수만 직접 붙여넣는다. memberRequest.js의 경우 조직도 API 3개 함수만 마지막에 추가했다.

 

 

체크리스트

✓ git diff source target -- file로 전체 변경사항 확인
✓ 새 파일인가? → 통째로 가져와도 OK
✓ 기존 파일인가? → 기능과 무관한 변경이 섞여있는지 확인
✓ 삭제된 import/함수가 대상 브랜치에서 아직 사용 중인지 확인
✓ 패키지 의존성(package.json)도 같이 옮겨야 하는지 확인

교훈

git checkout branch -- file은 "이 파일의 이 기능만 가져와"가 아니라 "이 파일의 모든 것을 가져와"다.

파일 단위 cherry-pick이라고 생각하면 안 되고, 파일 전체 덮어쓰기라고 생각해야 한다.

저작자표시 비영리 변경금지 (새창열림)

'개발자로 살아남기 > 트러블슈팅' 카테고리의 다른 글

[AIoT] 게이트웨이가 뭐길래? Level vs Edge Triggered 알람 이슈  (1) 2026.04.21
[CSS] ag-grid autoHeight vs normal 모드에서 가로 스크롤 제어하기  (0) 2026.04.06
[JS] Cannot read properties of null (reading 'shapeFlag') - setTimeout과 디바운스  (0) 2026.03.25
[JS] Promise.reject()와 setTimeout  (0) 2026.03.25
'개발자로 살아남기/트러블슈팅' 카테고리의 다른 글
  • [AIoT] 게이트웨이가 뭐길래? Level vs Edge Triggered 알람 이슈
  • [CSS] ag-grid autoHeight vs normal 모드에서 가로 스크롤 제어하기
  • [JS] Cannot read properties of null (reading 'shapeFlag') - setTimeout과 디바운스
  • [JS] Promise.reject()와 setTimeout
ming0o
ming0o
Jr. 프론트엔드 개발자의 성장(개발)일지입니다. 이전 : https://velog.io/@ming0o
  • ming0o
    주토피아
    ming0o
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Goals
        • 2026 목표 및 월간 회고
      • 개발자로 살아남기
        • 트러블슈팅
        • 코드 리뷰
        • 기술 정리
      • Dev
        • Vue
        • Node & Express
        • React Native
      • Challenge
        • KDT-핀테크 인턴십
        • 한이음 드림업
      • Learning
        • JavaScript
        • Algorithm
        • CS
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Vue
    try-catch문
    트러블슈팅
    replace
    수동배포
    이기고만다
    지피티
    타입에러
    Push
    Router
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
ming0o
[Git] 브랜치 간 변동 사항을 옮길 때 주의할 점
상단으로

티스토리툴바