로컬 develop 오염으로 PR 커밋이 섞인 문제와 해결
로컬 develop 오염으로 PR 커밋이 섞인 문제와 해결
문제 상황
기능별로 브랜치를 나눠 PR을 생성하는 과정에서 의도하지 않은 커밋이 포함되는 문제가 발생했다.
- 모든 PR의 base는
develop - 하지만 특정 PR에 이전 작업의 커밋과 변경 파일이 함께 포함됨
- 예:
feature/common-responsePR에common-enums관련 변경이 같이 노출
원인 분석
문제의 핵심은 브랜치 전략이 아니라 로컬 develop 브랜치의 상태였다.
다음과 같은 흐름이 있었다.
1
2
3
4
git checkout develop
git merge feature/common-enums # 로컬에만 merge
git checkout -b feature/common-response
이 경우 상태는 다음과 같이 나뉜다.
1
2
3
4
5
6
7
8
origin/develop
└─ 실제 기준이 되는 develop
local develop
└─ feature/common-enums 커밋이 포함된 상태
feature/common-response
└─ local develop 기준으로 분기됨
즉, 새 브랜치가 이미 이전 feature 커밋을 포함한 상태에서 생성된 것이다.
PR에서 커밋이 섞여 보인 이유
PR은 다음 기준으로 비교된다.
1
2
base: develop (origin/develop)
compare: feature/common-response
하지만 feature/common-response에는 로컬에서 merge된 common-enums 커밋이 포함되어 있었기 때문에
👉 GitHub는 이를 “새로운 변경”으로 인식
결과적으로 PR에 불필요한 변경 사항이 함께 표시되었다.
해결 방법
1. 기존 브랜치 백업
1
2
git checkout feature/common-response
git branch backup/common-response
2. 원격 develop 기준으로 clean 브랜치 생성
1
2
git fetch origin
git checkout -b feature/common-response-clean origin/develop
3. 필요한 커밋만 cherry-pick
1
git cherry-pick <커밋_HASH>
4. 기존 PR 브랜치에 강제 반영
1
git push --force-with-lease origin feature/common-response-clean:feature/common-response
- PR 브랜치 이름 유지
- 불필요한 커밋 제거
예방 방법
1. 로컬 develop을 항상 원격 기준으로 동기화
1
2
3
git checkout develop
git fetch origin
git reset --hard origin/develop
또는:
1
git pull origin develop
2. 로컬 develop에 feature 브랜치 직접 merge 금지
1
2
git checkout develop
git merge feature/common-enums # 지양
👉 feature → develop 병합은 반드시 PR을 통해 수행
3. 새 브랜치는 항상 origin/develop 기준으로 생성
1
2
git fetch origin
git checkout -b feature/common-response origin/develop
4. PR 전 커밋 범위 확인
1
git log --oneline origin/develop..HEAD
- 현재 작업과 무관한 커밋이 있다면 정리 필요
핵심 정리
- 문제의 본질은 브랜치 생성 위치가 아니라 오염된 로컬 develop
- 로컬에서 merge된 커밋은 원격과 다른 히스토리를 만든다
- 이 상태에서 브랜치를 생성하면 이전 작업이 함께 포함된다
- 해결은
origin/develop기준으로 브랜치를 재구성하고 cherry-pick - 예방은 모든 병합을 PR 기반으로 일원화하는 것
한 줄 정리
브랜치 문제처럼 보였지만, 실제 원인은 로컬 develop의 히스토리 오염이었다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.