충돌 해결하기

한 줄 요약

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.js

5단계: 커밋

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

  1. Git → Resolve Conflicts
  2. 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 웹에서 해결

  1. PR 페이지에서 “Resolve conflicts” 클릭
  2. 웹 에디터에서 마커 제거
  3. “Mark as resolved” 클릭
  4. “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
# 다시 충돌 해결

충돌 예방 팁

  1. 자주 pull: 작업 전 git pull origin main
  2. 작은 PR: 변경사항을 작게 유지
  3. 빠른 병합: 브랜치를 오래 열어두지 않기
  4. 소통: 같은 파일 작업 시 팀원과 조율

관련 명령어

더 알아보기