GitHub PR에서 Merge Conflict란?
GitHub Pull Request에서 "Squash and Merge"를 누르면 충돌이 생기는 걸까? PR 체크 실패, 리뷰 미승인, Merge Conflict의 차이를 코드 예시와 함께 명확하게 정리합니다.
목차
- GitHub PR이 머지되지 않는 3가지 이유
- Merge Conflict란 정확히 무엇인가
- Squash and Merge vs Conflict — 어떤 관계인가
- Conflict 해결하는 법 (실전 명령어)
- Merge 방식 3가지 비교
- 정리 한 줄 요약
1. GitHub PR이 머지되지 않는 3가지 이유
PR을 올렸는데 머지가 안 된다면, 보통 아래 3가지 중 하나입니다.
| 원인 | 설명 | 해결 방법 |
|---|---|---|
| Review required | 리뷰어 N명의 Approve가 아직 없음 | 팀원에게 리뷰 요청 |
| CI/CD 체크 실패 | Unit test, SonarCloud 등 자동 체크 실패 | 코드 수정 후 재push |
| Merge Conflict | 같은 파일·같은 줄을 여러 사람이 수정 | 충돌 수동 해결 |
Bypass rules and merge는 관리자 권한이 있을 때만 사용 가능한 강제 머지 옵션입니다.
프로덕션 코드에는 신중하게 사용하세요.

2. Merge Conflict란 정확히 무엇인가
Conflict는 같은 파일의 같은 줄을 두 사람이 동시에 수정했을 때, Git이 "어느 버전을 써야 해?"라고 묻는 상황입니다.
# Conflict 발생하는 케이스
다른 사람 → UserService.java 10번째 줄 수정
나 → UserService.java 10번째 줄 수정
결과 → ⚠️ CONFLICT
# Conflict 발생하지 않는 케이스
다른 사람 → UserService.java 수정
나 → OrderService.java 수정
결과 → ✅ No conflict (파일 자체가 다름)
# 같은 파일이지만 다른 줄인 경우
다른 사람 → UserService.java 10번째 줄 수정
나 → UserService.java 50번째 줄 수정
결과 → ✅ No conflict (줄이 다름)
3. Squash and Merge vs Conflict — 어떤 관계인가
많은 분들이 "Squash and Merge를 하면 충돌이 생기는 것 아닌가?"라고 오해하는데, 전혀 그렇지 않습니다.
Squash and Merge는 Conflict가 이미 없을 때 선택하는 "어떤 방식으로 합칠까"의 옵션입니다.
Conflict가 있으면 머지 버튼 자체가 비활성화됩니다.
브랜치 관계를 시각화하면 이렇습니다:
# 충돌 없는 상태 (Squash and Merge 가능)
main: A → B → C ← 다른 사람이 먼저 머지한 커밋
↑
내 브랜치: A → B → D ← 내가 작업한 커밋
C와 D가 건드린 파일이 다름 → Conflict 없음 ✅
→ Squash and Merge 선택 가능
즉, "최신 소스가 다른 사람 것이지만, 내가 건드린 파일과 겹치지 않는다"는 뜻이 Conflict 없음입니다.
4. Conflict 해결하는 법 (실전 명령어)
Conflict가 발생했다면 GitHub 웹에서 해결하거나, 로컬에서 아래 명령어로 해결합니다.
# 1. 내 브랜치로 이동
git checkout 내브랜치
# 2. 최신 main 가져오기
git fetch origin
# 3. rebase로 충돌 확인
git rebase origin/main
# → 충돌 난 파일 열어서 수동 수정
# 4. 수정 완료 후
git add .
git rebase --continue
# 5. 원격 브랜치에 강제 push
git push origin 내브랜치 --force
⚠️
--forcepush는 PR 브랜치에만 사용하세요.main/master브랜치에 force push는 절대 금지입니다.
5. Merge 방식 3가지 비교
Conflict가 없는 상태에서 머지할 때, 어떤 방식을 선택하느냐에 따라 커밋 히스토리 모양이 달라집니다.
| 방식 | 설명 | 히스토리 | 추천 상황 |
|---|---|---|---|
| Create a merge commit | 브랜치의 모든 커밋을 그대로 보존 + merge commit 추가 | 복잡 | 커밋 히스토리를 모두 보존하고 싶을 때 |
| Squash and merge | 브랜치의 모든 커밋을 1개로 압축해서 main에 추가 | 깔끔 ✅ | WIP 커밋이 많아서 정리하고 싶을 때 (가장 무난) |
| Rebase and merge | 커밋을 main 위에 순서대로 재배치 | 선형 | merge commit 없이 선형 히스토리를 유지하고 싶을 때 |
팀 컨벤션이 없다면 Squash and merge가 가장 무난한 선택입니다.

6. 정리 한 줄 요약
- Conflict = 같은 파일·같은 줄을 두 사람이 수정했을 때, 머지 전에 해결해야 하는 것
- Squash and merge = Conflict 없을 때 "어떤 방식으로 합칠까"를 선택하는 옵션
- 둘은 순서가 다른 개념입니다. Conflict 먼저 해결 → 그 다음 머지 방식 선택