충돌 해결하기
한 줄 요약
Git 충돌 발생 시 마커를 제거하고 원하는 코드를 선택하여 커밋
선행 지식
이런 메시지가 보이나요?
CONFLICT (content): Merge conflict in 파일명 Automatic merge failed; fix conflicts and then commit the result.
해결 순서
1단계: 충돌 파일 확인
$ git status
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: app.js ← 충돌 파일
both modified: utils.js ← 충돌 파일2단계: 파일 열어서 충돌 확인
// app.js
function calculate(a, b) {
<<<<<<< HEAD
// 내 코드 (현재 브랜치)
return a + b;
=======
// 병합하려는 코드 (다른 브랜치)
return a * b;
>>>>>>> feature/multiply
}3단계: 충돌 해결
방법 A: 내 코드만 유지
function calculate(a, b) {
return a + b;
}방법 B: 상대방 코드만 유지
function calculate(a, b) {
return a * b;
}방법 C: 둘 다 합치기
function calculate(a, b, operation) {
if (operation === 'add') {
return a + b;
}
return a * b;
}주의
<<<<<<<,=======,>>>>>>>마커를 모두 제거해야 합니다!
4단계: 해결 완료 표시
git add app.js utils.js5단계: 커밋
git commit
# 또는 메시지 직접 지정
git commit -m "Merge feature/multiply, resolve conflicts"에디터별 충돌 해결
VS Code
VS Code는 충돌을 시각적으로 표시하고 버튼으로 해결할 수 있습니다:
┌─────────────────────────────────────────────────────────────────┐
│ <<<<<<< HEAD (Current Change) │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ Accept Current | Accept Incoming | Accept Both | Compare │ │
│ └───────────────────────────────────────────────────────────┘ │
│ return a + b; (초록색) │
│ ═══════════════════════════════════════════════════════════════ │
│ return a * b; (파란색) │
│ >>>>>>> feature/multiply (Incoming Change) │
└─────────────────────────────────────────────────────────────────┘
버튼 클릭으로 해결:
- Accept Current: 내 코드 유지
- Accept Incoming: 상대방 코드 유지
- Accept Both: 둘 다 유지
- Compare: 차이 비교
IntelliJ / WebStorm
- Git → Resolve Conflicts
- 3-way merge 도구 사용
명령줄 도구
# 설정된 merge 도구 실행
git mergetool
# 특정 도구 지정
git mergetool -t vimdiff상황별 해결 방법
내 코드만 유지하고 싶을 때
# 특정 파일
git checkout --ours app.js
git add app.js
# 모든 충돌 파일
git checkout --ours .
git add .상대방 코드만 유지하고 싶을 때
# 특정 파일
git checkout --theirs app.js
git add app.js
# 모든 충돌 파일
git checkout --theirs .
git add .병합 자체를 취소하고 싶을 때
git merge --abort병합 시작 전 상태로 돌아갑니다.
Pull Request에서 충돌 해결
방법 1: 로컬에서 해결
# 1. 최신 main 가져오기
git fetch origin
# 2. 내 브랜치로 이동
git switch feature/my-branch
# 3. main 병합
git merge origin/main
# 4. 충돌 해결
# ... 파일 수정 ...
git add .
git commit
# 5. push
git push origin feature/my-branch방법 2: GitHub 웹에서 해결
- PR 페이지에서 “Resolve conflicts” 클릭
- 웹 에디터에서 마커 제거
- “Mark as resolved” 클릭
- “Commit merge” 클릭
언제 웹에서 해결?
- 간단한 충돌 (몇 줄)
- 빠른 해결이 필요할 때
복잡한 충돌은 로컬에서 해결하는 것이 좋습니다.
충돌 해결 검증
해결 후 확인:
# 상태 확인 (Unmerged 없어야 함)
git status
# 마커가 남아있는지 확인
grep -r "<<<<<<" .
grep -r "======" .
grep -r ">>>>>>" .
# 빌드/테스트 실행
npm run build
npm test자주 하는 실수
충돌 마커를 그대로 커밋
증상: 코드에 <<<<<< 등이 남아있음
해결: 파일을 다시 열어서 마커 제거 후 재커밋
git add 수정한파일
git commit --amend충돌 해결 후 add 깜빡함
$ git commit
error: Committing is not possible because you have unmerged files.해결:
git add 충돌해결한파일
git commit잘못된 코드를 선택
해결: 병합 커밋 이전으로 되돌리고 다시 병합
git reset --hard HEAD~1
git merge feature/branch
# 다시 충돌 해결충돌 예방 팁
- 자주 pull: 작업 전
git pull origin main - 작은 PR: 변경사항을 작게 유지
- 빠른 병합: 브랜치를 오래 열어두지 않기
- 소통: 같은 파일 작업 시 팀원과 조율
관련 명령어
- git merge - 병합
- git status - 상태 확인
- git diff - 변경사항 비교
- git reset - 되돌리기
더 알아보기
- Conflict란 - 충돌의 원리
- git merge - 병합 방법
- Pull Request란 - PR에서 충돌 해결