Git Partial Merge 시 develop 변경이 삭제되는 문제 정리
Git Partial Merge 시 develop 변경이 삭제되는 문제 정리
# Git Partial Merge 시 발생하는 develop 삭제 문제 — 전체 정리
1) 문제의 시작
너는 main 브랜치에서 develop의 일부 변경만 가져오고 싶어서 다음 명령을 사용했다:
1
2
3
git merge develop --no-ff --no-commit
# 이후 원하지 않는 변경 제거
git commit -m "partial merge" --no-verify
겉으로는 잘 된 것처럼 보였지만, 이후 문제 발생:
- develop → main merge 시
- develop 변경이 diff로 잡히지 않음
- 일부 변경이 삭제된 것처럼 취급됨
- 심하면 develop 코드가 사라져버림
2) 원인
문제의 핵심은 다음 한 줄이다:
merge commit(부모가 2개인 commit)이 생성되면 Git은 develop의 나머지 변경을 “삭제된 변경”으로 기록한다.
즉,
1
2
git merge develop --no-commit
git commit
이 조합은 반드시 merge commit을 만든다.
이 merge commit은:
- main이 develop의 일부 변경을 삭제했다(거부했다)
- 나머지 develop 변경은 main에서는 필요 없다고 판단했다
라고 Git에게 기록된다.
그 결과:
- 이후 develop → main merge 시 Git은 나머지 변경을 스킵함
- diff가 나오지 않거나
- develop 코드가 삭제된 상태가 유지됨
- Git이 “네가 예전에 그 코드 삭제했잖아?”라고 판단하는 것
3) 중요한 사실
❗ merge commit을 만들면 —no-verify를 써도 의미가 없다
--no-verify는 pre-commit hook 우회 옵션일 뿐, merge commit 구조 자체를 변경하지 않는다.
삭제 기록이 남는 이유는:
- hook 때문이 아니라
- merge commit 자체 때문
따라서:
1
git commit -m … --no-verify
은 삭제 문제의 원인과 무관하다.
4) 부분 병합을 하면서 삭제 기록을 남기지 않는 단 한 가지 원칙
👉 merge commit을 만들지 말아야 한다.
이 원칙만 지키면 partial merge는 100% 안전하게 된다.
5) 삭제 기록 없이 Partial Merge를 수행하는 정석 절차
🔥 정답 절차
1
2
3
4
5
git merge develop --no-commit --no-ff
git reset HEAD # ✨ merge-parent 정보 제거
# 필요한 코드만 직접 수정/정리
git add .
git commit -m "partial merge (manual)" --no-verify
이 절차의 핵심:
git merge는 staging까지는 쓸 수 있다- 하지만 commit 단계에서 merge-parent를 반드시 제거해야 한다
- 그래서 git reset HEAD 가 결정적으로 중요
결과:
- 이 commit은 merge commit이 아닌 일반 commit
- Git은 이것을 “코드 변경”으로만 인식
- develop의 나머지 변경을 삭제했다는 기록이 없음
- 향후 develop → main merge도 정상 diff가 뜬다
6) 이미 잘못된 partial merge commit이 있다면?
1) 되돌리기(안전)
1
git revert <partial-merge-commit>
2) 히스토리 삭제(혼자 작업할 때)
1
git reset --hard <문제 커밋 이전 SHA>
이후 올바른 방식으로 partial merge를 다시 진행하면 됨.
7) 디렉터리/파일을 특정할 수 없을 때?
코드 조각을 직접 보고 판단해야 하는 상황이라면:
- merge staging 활용
- merge-parent 제거
- 일반 commit 생성
이 방식이 가장 현실적이다.
1
2
3
4
5
git merge develop --no-commit
git reset HEAD
# 코드 보고 필요한 부분만 반영
git add .
git commit -m "partial merge" --no-verify
폴더를 지정할 필요 없음.
8) diff 기반 partial merge
경로를 특정하기 어렵지만 전체 diff에서 특정 부분만 가져오고 싶다면:
1
2
3
git diff main..develop > partial.patch
git apply partial.patch
git commit -am "partial merge (patch)" --no-verify
이것도 안전하다.
최종 결론 (정리의 정리)
❌ 잘못된 partial merge
1
2
git merge develop --no-commit
git commit # merge commit → 삭제 기록 생성
✔ 올바른 partial merge
1
2
3
4
5
git merge develop --no-commit
git reset HEAD
(코드 정리)
git add .
git commit --no-verify # 일반 commit
핵심은 merge commit을 만들지 않는 것이다.
This post is licensed under CC BY 4.0 by the author.