Conflict란

한 줄 요약

두 브랜치에서 같은 파일의 같은 부분을 다르게 수정했을 때 발생하는 충돌

개요

Conflict(충돌)는 Git이 자동으로 병합할 수 없는 상황입니다. 같은 코드를 다르게 수정했을 때 발생하며, 사람이 직접 어떤 코드를 유지할지 결정해야 합니다.

핵심 포인트

  • 충돌은 자연스러운 현상 (두려워하지 마세요!)
  • Git은 충돌을 표시해주고, 해결은 사람이
  • 같은 파일의 같은 부분을 수정해야 충돌 발생

충돌이 발생하는 경우

예시 상황

원본 (c2):
  line 1
  line 2
  line 3

    │
    ├────────────────┐
    │                │
    ▼                ▼

A 브랜치:         B 브랜치:
  line 1            line 1
  line 2 수정A      line 2 수정B   ← 같은 줄을 다르게 수정!
  line 3            line 3

두 브랜치를 병합하면 → 충돌 발생!

충돌이 발생하지 않는 경우

다른 파일 수정

A 브랜치: app.js 수정
B 브랜치: utils.js 수정
→ 충돌 없음 ✅

같은 파일, 다른 부분 수정

A 브랜치: app.js 1-10줄 수정
B 브랜치: app.js 50-60줄 수정
→ 충돌 없음 (자동 병합) ✅

같은 내용으로 수정

A 브랜치: line 2 → "hello"
B 브랜치: line 2 → "hello"  (동일)
→ 충돌 없음 ✅

충돌 시 Git의 표시

충돌이 발생하면 Git이 파일에 마커를 추가합니다:

function login() {
<<<<<<< HEAD
  // 내 브랜치의 코드
  return authenticate(user, password);
=======
  // 병합하려는 브랜치의 코드
  return validateAndAuthenticate(user, password);
>>>>>>> feature/auth
}

마커 설명

마커의미
<<<<<<< HEAD내 브랜치(현재) 코드 시작
=======구분선
>>>>>>> branch-name병합할 브랜치 코드 끝

충돌이 발생하는 상황

1. git merge

$ git merge feature
Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
Automatic merge failed; fix conflicts and then commit the result.

2. git pull

$ git pull origin main
Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
Automatic merge failed; fix conflicts and then commit the result.

3. git rebase

$ git rebase main
Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
error: could not apply a1b2c3d

4. Pull Request (GitHub)

┌─────────────────────────────────────────────────────────────────┐
│ ⚠️ This branch has conflicts that must be resolved             │
│                                                                  │
│ Conflicting files:                                              │
│   • src/app.js                                                  │
│                                                                  │
│ [Resolve conflicts] [Use command line]                          │
└─────────────────────────────────────────────────────────────────┘

충돌 예방 방법

1. 자주 동기화

# 작업 전 최신 상태로
git pull origin main
 
# 작업 중에도 주기적으로
git fetch origin
git merge origin/main

2. 작은 단위로 작업

  • 하나의 기능 = 하나의 PR
  • 오래 열린 브랜치 피하기

3. 팀원과 소통

  • 같은 파일 작업 시 미리 알리기
  • 코드 영역 분담

4. 브랜치 수명 최소화

# 브랜치 생성
git switch -c feature
 
# 빠르게 작업 완료
 
# 빠르게 병합
git switch main
git merge feature

충돌 vs 에러

충돌 (Conflict)에러 (Error)
정상적인 상황문제 상황
코드가 겹침명령어/권한 문제
수동 해결 필요원인 파악 필요
CONFLICT 메시지error, fatal 메시지

자주 하는 실수

충돌 마커를 그대로 커밋

// ❌ 이렇게 커밋하면 안 됨!
<<<<<<< HEAD
  return a;
=======
  return b;
>>>>>>> feature

해결: 마커를 모두 제거하고 원하는 코드만 남기세요.

충돌 해결 없이 작업 계속

$ git status
You have unmerged paths.

해결: 먼저 충돌을 해결하세요.

# 충돌 파일 확인
git status
 
# 해결 후
git add 충돌해결한파일
git commit

관련 명령어

더 알아보기