충돌이 왜 발생하는지 원리 이해, 충돌 표식(<<<<<<·======·>>>>>>>) 읽는 법, 에디터로 직접 충돌 해결 후 커밋, merge 중단(--abort), VS Code에서 시각적으로 충돌 해결하기까지 실전 대응 능력을 완전히 갖춥니다.
🎯 학습 목표
이 강을 마치면 다음을 할 수 있습니다.
- 충돌이 어떤 상황에서 왜 발생하는지 원리를 설명할 수 있습니다.
- 파일에 표시된 충돌 표식을 읽고 두 변경 사항을 구분할 수 있습니다.
- 텍스트 에디터로 충돌을 직접 해결하고 커밋까지 완료할 수 있습니다.
- 머지 중 문제가 생기면
--abort로 안전하게 중단할 수 있습니다.
💥 충돌(Conflict)이란 무엇인가
이 섹션에서는 충돌이 발생하는 원리와 Git이 어떤 경우에 충돌을 보고하는지 살펴보겠습니다.
충돌(Merge Conflict)은 두 브랜치에서 같은 파일의 같은 줄(또는 인접한 줄)을 서로 다르게 수정했을 때 발생합니다. Git은 자동으로 합칠 수 없는 경우 작업자에게 "여기서 어떤 버전을 선택할지 직접 결정해 달라"고 알립니다.
충돌이 발생하는 구체적인 상황입니다.
- 같은 줄 수정: main에서 "배경색을 파란색"으로, feature에서 "배경색을 빨간색"으로 변경 → 어느 것이 맞는지 Git이 결정할 수 없음
- 한쪽은 수정, 다른쪽은 삭제: main에서 파일을 수정했는데 feature에서 같은 파일을 삭제한 경우
- 같은 파일명으로 다른 내용 추가: 두 브랜치에서 각각 새 파일을 같은 이름으로 만든 경우
충돌을 두려워할 필요 없습니다. 충돌은 "우리 둘 다 같은 부분을 고쳤으니, 사람이 어떤 게 맞는지 결정해 줘"라는 Git의 도움 요청입니다. Git은 여러분이 해결할 때까지 현재 상태를 안전하게 보존합니다.
🔍 충돌 표식 읽기
이 섹션에서는 충돌이 발생한 파일에 Git이 삽입하는 충돌 표식의 의미를 살펴보겠습니다.
충돌이 발생하면 Git은 해당 파일을 직접 수정해서 충돌 구간을 표시합니다. 파일 안에 다음과 같은 표식이 삽입됩니다.
# 충돌이 발생한 파일 내부 (index.html 예시)
<div class="header">
<<<<<<< HEAD
<h1 style="color: blue">환영합니다</h1>
=======
<h1 style="color: red">어서오세요</h1>
>>>>>>> feature/header-redesign
</div>
세 개의 구분자가 충돌 구간을 나눕니다.
<<<<<<< HEAD: 충돌 구간 시작. HEAD(현재 브랜치 = 합치는 쪽)의 내용=======: 두 버전의 경계선>>>>>>> feature/header-redesign: 합쳐오는 브랜치(feature)의 내용
즉, ======= 위는 "현재 내가 있는 브랜치(HEAD)의 버전"이고, 아래는 "합치려는 브랜치의 버전"입니다.
🛠️ 충돌 해결 단계별 절차
이 섹션에서는 충돌 발생부터 해결 완료까지 전체 절차를 단계별로 살펴보겠습니다.
# 1단계: merge 시도 → 충돌 발생
git switch main
git merge feature/header-redesign
# 출력 (충돌 발생 시):
# Auto-merging index.html
# CONFLICT (content): Merge conflict in index.html
# Automatic merge failed; fix conflicts and then commit the result.
# 2단계: 충돌 파일 목록 확인
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: index.html
# 3단계: 에디터로 충돌 파일 열어 직접 수정
# 목표: <<<<<, =====, >>>>> 표식을 완전히 제거하고
# 원하는 최종 내용만 남기기
# 예: 두 버전을 합친 최종 결과
# <div class="header">
# <h1 style="color: blue">환영합니다</h1> <!-- main 버전 선택 -->
# </div>
# 4단계: 해결한 파일을 스테이징
git add index.html
# 5단계: 모든 충돌 해결 후 커밋
git commit
# (에디터가 열리며 기본 커밋 메시지 제안: "Merge branch 'feature/...'")
# 저장 후 닫으면 merge commit 완성
# 또는 메시지를 직접 지정
git commit -m "merge: header 디자인 변경 병합 (main 버전 유지)"
충돌 해결 시 가장 흔한 실수는 충돌 표식(<<<<<<<, =======, >>>>>>>)을 파일에 그대로 남겨두는 것입니다. 커밋 전 반드시 파일에서 이 표식이 완전히 제거됐는지 확인하세요.
🚫 merge 중단 — git merge --abort
이 섹션에서는 충돌 해결 도중 merge 자체를 취소하고 시작 전 상태로 돌아가는 방법을 살펴보겠습니다.
충돌 해결이 너무 복잡하거나, merge 자체가 잘못됐다고 판단될 때 취소할 수 있습니다. --abort는 merge 시작 전 상태로 완전히 되돌립니다.
# merge 중단 (충돌 상태에서만 사용 가능)
git merge --abort
# 결과: merge 시작 전 상태로 완전히 복원
# 충돌 표식이 제거된 원래 파일로 돌아감
git status
# On branch main
# nothing to commit, working tree clean
--abort는 merge 작업 도중에만 사용할 수 있습니다. merge commit이 완료된 이후에는 사용할 수 없으며, 그 경우에는 15강 "되돌리기 전략"에서 배울 git revert나 git reset을 사용해야 합니다.
💻 VS Code에서 충돌 해결하기
이 섹션에서는 텍스트 표식 대신 VS Code의 시각적 충돌 해결 도구를 사용하는 방법을 살펴보겠습니다.
VS Code는 충돌 파일을 열면 자동으로 충돌 구간을 색상으로 강조하고 버튼으로 선택할 수 있게 합니다. 텍스트 표식을 직접 편집하는 것보다 훨씬 직관적입니다.
# VS Code에서 충돌 해결 흐름
# 1. 충돌 발생 후 VS Code에서 파일 열기
code index.html
# VS Code에서 충돌 구간마다 4개 버튼이 표시됨:
# [Accept Current Change] → HEAD(현재 브랜치) 버전 선택
# [Accept Incoming Change] → 합쳐오는 브랜치 버전 선택
# [Accept Both Changes] → 두 버전 모두 유지 (아래에 추가)
# [Compare Changes] → 두 버전 나란히 비교
# 2. 각 충돌 구간에서 원하는 버튼 클릭
# 3. 저장 후 터미널로 돌아와 나머지 단계 진행
git add index.html
git commit
VS Code의 소스 컨트롤(Source Control) 패널(왼쪽 사이드바 Git 아이콘)에서도 충돌 파일 목록을 확인하고 바로 에디터로 이동할 수 있습니다.
🔮 충돌 예방 전략
이 섹션에서는 충돌 자체를 줄이는 팀 워크플로 전략을 살펴보겠습니다.
충돌을 완전히 없앨 수는 없지만, 빈도와 복잡도를 크게 줄이는 방법이 있습니다.
- 작은 단위로 자주 병합: 오랫동안 분기한 브랜치일수록 충돌이 많고 복잡해집니다. 브랜치를 짧게 유지하고 자주 merge하세요.
- main 브랜치를 자주 당겨오기: feature 브랜치에서 작업 중에도 main의 새 변경을 주기적으로 가져오면(
git merge main) 나중에 충돌 범위가 줄어듭니다. - 역할 분리: 팀원끼리 담당 파일/기능을 명확히 나눠 같은 파일을 동시에 수정하는 상황을 최소화합니다.
- 코드 리뷰 + 커뮤니케이션: Pull Request를 통해 merge 전 리뷰하고, 겹칠 수 있는 작업을 미리 팀에 공유합니다.
📝 핵심 요약
9강에서 배운 내용을 정리해 보겠습니다.
# 충돌 해결 절차
git merge 브랜치명 # 1. merge 시도 (충돌 발생)
git status # 2. 충돌 파일 확인
# 에디터에서 <<<, ===, >>> 표식 제거 후 원하는 내용으로 수정
git add 충돌파일 # 3. 해결한 파일 스테이징
git commit # 4. merge commit 생성
# 취소 (merge 도중에만)
git merge --abort # merge 중단, 시작 전으로 복원
충돌 표식 요약: <<<<<<< HEAD — 현재 브랜치 | ======= — 경계선 | >>>>>>> 브랜치명 — 합쳐오는 브랜치
다음 강인 10강 — GitHub 시작에서는 지금까지 로컬에서만 작업하던 Git 저장소를 GitHub에 올리는 방법을 배웁니다. 계정 생성부터 원격 저장소(Remote Repository) 개념, 최초 push까지 협업의 첫 문을 함께 열겠습니다!
관련 주제
- Merge Conflict
- 충돌 표식
- git merge --abort
- 충돌 수동 해결
- VS Code 충돌 해결
- 개발·프로그래밍
- 개발·프로그래밍 강의
- 깃허브 사용법 18강 — Git & GitHub 협업
- 무료강의
- 무료 온라인 강의
- NUGUNA
- 누구나
📚 시리즈 전체 공유
깃허브 사용법 18강 — Git & GitHub 협업
이 강의가 속한 시리즈는 총 12강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.
댓글
불러오는 중...
