VSCode에서 Git merge conflict 충돌 파일을 확인하고 해결하는 화면을 표현한 대표이미지

Git 충돌은 파일을 지우는 문제가 아니라 서로 다른 변경 내용을 확인해 하나의 결과로 정리하는 과정입니다.


Git merge conflict는 두 브랜치 또는 로컬과 원격 저장소가 같은 파일의 같은 부분을 다르게 수정했을 때 발생합니다. 터미널에 CONFLICT (content), Automatic merge failed, fix conflicts and then commit the result가 보이면 Git이 자동으로 합치지 못한 부분을 직접 정리해야 한다는 뜻입니다.


처리 순서는 복잡하지 않습니다. 먼저 충돌 상태를 확인하고, 충돌 파일을 열어 최종 코드만 남긴 뒤, 수정한 파일을 git add로 표시하고 merge commit을 완료하면 됩니다. VSCode를 사용한다면 충돌 구간을 비교하면서 Accept Current, Accept Incoming, Accept Both를 상황에 맞게 선택할 수 있습니다.


Git merge conflict 오류 메시지 원문

가장 흔한 메시지는 아래와 비슷합니다. git pull, git merge, 브랜치 병합 과정에서 자주 보이며, 파일명만 프로젝트에 따라 달라집니다.


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

CONFLICT (content)는 파일 내용 충돌을 뜻합니다. Automatic merge failed는 Git이 자동 병합을 멈췄다는 뜻입니다. fix conflicts and then commit the result는 충돌 파일을 수정한 뒤 그 결과를 commit하라는 안내입니다.


빠른 해결 흐름

1. git status로 충돌 파일 확인 → 2. VSCode 또는 편집기에서 충돌 표시 정리 → 3. 필요한 코드만 남기고 저장 → 4. git add 파일명 실행 → 5. git commit 또는 git merge --continue로 병합 완료


언제 merge conflict가 발생할까

merge conflict는 보통 협업 중 같은 파일을 여러 사람이 수정했을 때 생깁니다. 특히 기능 브랜치에서 오래 작업한 뒤 원격 main 브랜치를 늦게 가져오거나, 같은 설정 파일·라우팅 파일·패키지 파일을 동시에 수정했을 때 자주 발생합니다.


상황 자주 나오는 원인 먼저 할 일
git pull 중 충돌 내 로컬 변경과 원격 변경이 같은 줄을 수정 git status 확인
git merge 중 충돌 기능 브랜치와 기준 브랜치가 서로 다른 방향으로 수정 충돌 파일 목록 확인
VSCode에서 충돌 표시 파일 안에 conflict marker가 남아 있음 Current와 Incoming 차이 확인

만약 git pull 전에 로컬 수정 사항이 아직 commit되지 않은 상태라면 충돌보다 먼저 “덮어써질 수 있다”는 메시지가 나올 수 있습니다. 이 경우에는 로컬 변경을 보존할지, commit할지, stash할지 먼저 정한 뒤 merge conflict 해결로 넘어가는 것이 안전합니다.


먼저 확인할 Git 명령어

충돌이 발생하면 바로 reset부터 실행하지 말고 현재 상태를 확인해야 합니다. Git은 병합 중인 파일과 아직 해결되지 않은 파일을 상태 정보로 보여줍니다.


git status
git diff --name-only --diff-filter=U
git branch --show-current

git status는 가장 먼저 봐야 하는 명령어입니다. 여기서 both modified로 표시된 파일이 충돌 파일입니다. git diff --name-only --diff-filter=U는 아직 해결되지 않은 충돌 파일명만 간단히 보고 싶을 때 유용합니다.


Windows, Mac, Linux에서 명령어 차이

충돌 확인과 해결에 쓰는 Git 명령어는 Windows, Mac, Linux에서 거의 같습니다. 차이는 명령어 자체보다 터미널 환경, 줄바꿈 설정, 편집기 실행 방식에서 생깁니다. Windows에서는 Git Bash, PowerShell, VSCode 터미널을 섞어 쓰는 경우가 많으므로 같은 저장소를 열고 있는지 경로를 먼저 확인하는 편이 좋습니다.


충돌 파일 안에서 보이는 표시

충돌 파일을 열면 Git이 아래처럼 표시를 남깁니다. 이 표시는 최종 코드가 아니므로, 해결 후에는 <<<<<<<, =======, >>>>>>> 줄이 모두 사라져야 합니다.


<<<<<<< HEAD
현재 브랜치에 있던 코드
=======
병합되어 들어오는 브랜치의 코드
>>>>>>> feature/login

VSCode에서 Git 충돌 해결하는 방법

VSCode를 사용하면 충돌 파일을 직접 비교하면서 해결할 수 있습니다. 왼쪽 Source Control 패널에서 충돌 파일을 열면 파일 안에 선택 버튼이 표시되거나, 3-way merge editor로 현재 변경과 들어오는 변경을 나란히 볼 수 있습니다.


VSCode 처리 순서

1. VSCode에서 프로젝트 폴더를 엽니다.
2. 왼쪽 Source Control 아이콘을 클릭합니다.
3. Merge Changes 또는 충돌 파일 목록을 확인합니다.
4. 충돌 파일을 열고 Current, Incoming, Both 중 필요한 선택을 합니다.
5. 남은 코드가 의도한 결과인지 직접 읽어봅니다.
6. 파일을 저장하고 Source Control에서 stage 처리한 뒤 commit합니다.


Accept Current, Accept Incoming, Accept Both 차이

Accept Current는 현재 체크아웃한 브랜치 쪽 변경을 남깁니다. HEAD 아래에 표시되는 내용이라고 보면 됩니다. Accept Incoming은 병합되어 들어오는 쪽 변경을 남깁니다. git pull 중이라면 원격 브랜치에서 들어온 변경일 가능성이 높습니다. Accept Both는 양쪽 변경을 모두 남깁니다.


다만 Accept Both는 항상 정답이 아닙니다. import 문이 중복되거나, 같은 설정이 두 번 들어가거나, 함수가 중복 정의될 수 있습니다. 두 변경을 모두 살릴 때는 저장 후 테스트를 실행해 코드가 실제로 동작하는지 확인해야 합니다.


터미널에서 직접 해결하는 방법

터미널만으로도 해결할 수 있습니다. 핵심은 충돌 파일을 열어 marker를 지우고, 최종 코드만 남긴 뒤, Git에 “이 파일은 해결했다”고 알려주는 것입니다.


# 1. 충돌 상태 확인
git status

# 2. 충돌 파일 확인
git diff --name-only --diff-filter=U

# 3. 파일을 편집기로 열어 충돌 표시를 직접 정리
code src/app.js

# 4. 해결한 파일 stage
git add src/app.js

# 5. 남은 충돌이 없는지 확인
git status

# 6. merge commit 완료
git commit

일부 상황에서는 git commit 대신 아래 명령어를 사용할 수 있습니다. Git이 병합을 계속하라고 안내하는 상태라면 git merge --continue를 실행하면 됩니다.


git merge --continue

pull 중 충돌이 났을 때

git pull은 내부적으로 원격 변경을 가져온 뒤 현재 브랜치에 합치는 흐름으로 동작합니다. 따라서 pull 중 충돌이 발생해도 해결 방식은 merge conflict와 같습니다. 충돌 파일을 고치고 git add를 한 뒤 commit까지 마치면 됩니다.


rebase 중 충돌과는 무엇이 다를까

rebase 중 충돌이 발생하면 마무리 명령어가 다릅니다. merge 중이라면 git merge --continue 또는 git commit 흐름을 사용하지만, rebase 중이라면 충돌 파일을 해결한 뒤 git rebase --continue를 사용합니다.


# rebase 중 충돌 해결 후
git add src/app.js
git rebase --continue

하면 안 되는 실수

충돌이 났을 때 가장 위험한 행동은 내용을 이해하지 못한 상태에서 강제로 되돌리거나 원격 저장소를 덮어쓰는 것입니다. 특히 팀 저장소에서는 reset --hard, push --force를 쉽게 실행하면 다른 사람의 작업 흐름까지 망가질 수 있습니다.


주의해야 할 명령어

git reset --hard는 로컬 변경을 잃을 수 있고, git push --force는 원격 브랜치 기록을 덮어쓸 수 있습니다. 충돌 해결 목적이라면 먼저 git status, 백업 브랜치 생성, 팀원 확인 순서로 진행하는 편이 안전합니다.


충돌 해결을 포기하고 병합 전 상태로 돌아가고 싶다면 상황에 맞게 abort 명령을 사용합니다. merge 중이면 git merge --abort, rebase 중이면 git rebase --abort를 사용합니다.


# merge 중단
git merge --abort

# rebase 중단
git rebase --abort

해결 후 push까지 마무리하는 순서

충돌을 해결한 뒤에는 바로 push하기 전에 상태와 테스트를 확인하는 것이 좋습니다. 충돌 marker가 남아 있거나 두 변경이 모두 들어가면서 코드가 중복되면 commit은 되더라도 실행 중 오류가 날 수 있습니다.


git status
git diff --check

# 프로젝트에 맞는 테스트 실행
npm test
# 또는
pytest

git push

git push 단계에서 non-fast-forward 또는 Updates were rejected 메시지가 나오면 충돌 해결과는 다른 문제일 수 있습니다. 원격 브랜치가 이미 앞서 나간 상태라면 push 전에 원격 변경을 다시 반영해야 합니다.


공식 자료로 더 확인하기

Git 충돌 해결은 프로젝트 기록에 직접 영향을 주는 작업입니다. 명령어 의미가 헷갈릴 때는 블로그 글만 보고 따라 하기보다 Git과 VSCode 공식 문서를 함께 확인하는 것이 안전합니다.


Git 공식 문서: git merge

merge가 충돌로 멈췄을 때 continue, abort, commit 흐름을 어떻게 처리하는지 확인할 수 있습니다.

Git merge 공식 문서에서 충돌 처리 흐름 확인하기

Git 공식 문서: pull 중 충돌 처리

pull 과정에서 merge 또는 rebase 충돌이 생겼을 때 abort 명령을 어떻게 사용할 수 있는지 확인할 수 있습니다.

Git pull 공식 문서에서 충돌 중단 방법 확인하기

VS Code 공식 문서: merge conflicts

VSCode에서 inline action, 3-way merge editor, Source Control 화면으로 충돌을 해결하는 방법을 확인할 수 있습니다.

VS Code 공식 문서에서 merge conflict 해결 화면 확인하기

함께 보면 좋은 글

pull 전에 로컬 변경이 막힐 때
merge conflict 전에 local changes would be overwritten 메시지가 먼저 보인다면 충돌 해결보다 로컬 변경 보존 순서를 먼저 확인해야 합니다.
Git pull 오류 해결: Your local changes would be overwritten by merge 원인과 해결

충돌 해결 후 push가 거절될 때
충돌을 해결하고 commit까지 마쳤는데 push가 거절된다면 원격 브랜치 이력과 내 로컬 이력이 어긋난 상태일 수 있습니다.
Git push rejected 오류 해결: non-fast-forward와 Updates were rejected 순서

저장소 주소가 바뀌었을 때
충돌이 아니라 원격 저장소 주소가 바뀐 문제라면 merge conflict 해결보다 remote origin 주소 확인이 먼저입니다.
Git remote origin 변경 방법: 저장소 주소 바뀌었을 때 수정 순서

VSCode에서 Git 흐름을 처음 익힐 때
커밋, 푸시, 브랜치, 충돌 해결 흐름을 VSCode 화면 기준으로 한 번에 익히고 싶다면 기본 사용법부터 확인하면 좋습니다.
VSCode Git 입문 2026: 커밋/푸시/브랜치/충돌 해결

자주 묻는 질문

Q1. CONFLICT (content)는 무슨 뜻인가요?

CONFLICT (content)는 파일 내용 충돌을 뜻합니다. 같은 파일의 같은 위치를 현재 브랜치와 병합되어 들어오는 브랜치가 서로 다르게 수정했기 때문에 Git이 자동으로 하나를 고르지 못한 상태입니다. 파일을 열어 어떤 코드를 남길지 정리한 뒤 conflict marker를 제거하고 저장해야 합니다.

Q2. Accept Current와 Accept Incoming 중 무엇을 눌러야 하나요?

Accept Current는 현재 브랜치의 변경을 남기고, Accept Incoming은 병합되어 들어오는 변경을 남깁니다. git pull 중이라면 Incoming은 원격에서 들어온 변경일 가능성이 높습니다. 어느 쪽이 최신인지보다 최종 코드가 의도한 동작을 만족하는지가 더 중요하므로 선택 후 코드를 직접 읽고 테스트해야 합니다.

Q3. 충돌 해결 후 꼭 commit해야 하나요?

merge conflict는 충돌 파일을 수정하는 것만으로 끝나지 않습니다. 해결한 파일을 git add로 stage한 뒤 merge commit을 완료해야 병합이 끝납니다. Git 상태에 따라 git commit을 실행하거나 git merge --continue를 사용할 수 있습니다. rebase 중이라면 git rebase --continue를 사용해야 합니다.

Q4. 충돌이 너무 복잡하면 merge를 취소해도 되나요?

충돌 내용을 지금 판단하기 어렵다면 병합을 중단할 수 있습니다. merge 중이면 git merge --abort, rebase 중이면 git rebase --abort를 사용합니다. 다만 병합 시작 전 로컬 변경이 많았거나 병합 도중 파일을 추가로 고쳤다면 원하는 상태로 완전히 돌아가지 않을 수 있으므로 먼저 git status로 상태를 확인하는 것이 좋습니다.



Git merge conflict는 삭제하거나 강제로 덮어쓸 문제가 아니라, 현재 변경과 들어오는 변경을 비교해 최종 코드를 확인하고 commit으로 마무리하는 작업입니다.