git merge conflict 충돌 해결하는 법: 단계별 실전 가이드
git merge conflict 충돌, 무엇이 문제인가
git merge conflict(충돌)는 두 브랜치가 같은 파일의 같은 줄을 서로 다르게 수정했을 때 발생합니다. Git이 자동으로 어느 쪽을 선택할지 판단할 수 없어서 사람에게 결정을 넘기는 것입니다. 충돌은 에러가 아니라 정상적인 협업 과정이니 당황할 필요 없습니다. 이 글에서는 git merge conflict 충돌 해결을 처음부터 끝까지 따라할 수 있게 정리합니다.
증상: 이런 메시지가 뜹니다
Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
Automatic merge failed; fix conflicts and then commit the result.1단계: 충돌난 파일 확인하기
git statusUnmerged paths 아래에 표시된 파일이 충돌난 파일입니다. 그 파일들을 열어 직접 수정해야 합니다.
2단계: 충돌 표시 기호 읽는 법
충돌난 파일을 열면 이런 표시가 들어가 있습니다.
<<<<<<< HEAD
const title = "내 브랜치의 코드";
=======
const title = "상대 브랜치의 코드";
>>>>>>> feature/login| 기호 | 의미 |
|---|---|
<<<<<<< HEAD | 현재 내 브랜치의 변경 시작 |
======= | 두 변경의 경계선 |
>>>>>>> 브랜치명 | 병합하려는 상대 변경 끝 |
3단계: 직접 수정해서 해결하기
표시 기호(<<<, ===, >>>)를 모두 지우고, 최종적으로 남길 코드만 남깁니다. 예를 들어 상대 코드를 채택한다면 이렇게 됩니다.
const title = "상대 브랜치의 코드";두 코드를 합쳐야 한다면 둘 다 직관적으로 합쳐서 작성하면 됩니다. 핵심은 충돌 기호가 한 줄도 남지 않게 정리하는 것입니다.
4단계: 해결 완료를 Git에 알리기
# 수정한 파일을 스테이징
git add app.js
# 모든 충돌을 해결했으면 커밋
git commitmerge 도중 commit은 메시지가 자동으로 채워지므로 그대로 저장해도 됩니다.
해결이 막막할 때: merge 취소하기
충돌이 너무 복잡해서 처음부터 다시 하고 싶다면 병합 자체를 취소할 수 있습니다.
# 병합을 중단하고 merge 시작 전 상태로 복귀
git merge --abort이 명령은 안전합니다. 충돌 처리 전 상태로 깔끔하게 돌아갑니다.
한쪽을 통째로 선택하고 싶을 때
# 내 브랜치(현재) 버전을 채택
git checkout --ours app.js
# 상대 브랜치 버전을 채택
git checkout --theirs app.js
# 그 다음 반드시 add
git add app.js주의: rebase 중에는 ours/theirs의 의미가 반대로 뒤집힙니다. rebase에서는 --ours가 "내가 올라타려는 베이스 브랜치"를 가리키니 헷갈리지 않게 확인 후 사용하세요.
rebase 도중 충돌이 났다면
# 충돌 파일 수정 후
git add 수정한파일
git rebase --continue
# 포기하고 되돌리기
git rebase --abort주의점 정리
- 충돌 기호를 지우지 않고 커밋하면 코드에 그대로 남으니 반드시 확인
- VS Code 등 에디터의 "Accept Current/Incoming" 버튼을 활용하면 편합니다
- 해결 후
git status로 Unmerged paths가 사라졌는지 꼭 확인
자주 묻는 질문
Q1. 충돌 해결 후 코드가 깨졌는지 어떻게 확인하나요?
커밋 전에 반드시 코드를 실행하거나 테스트해 보세요. 충돌을 합치는 과정에서 한쪽 로직이 빠지거나 중복될 수 있습니다. git diff로 최종 결과를 한 번 더 검토하는 습관도 좋습니다.
Q2. merge --abort를 했는데도 충돌이 남아 있어요.
이미 일부 파일을 git add 한 뒤라면 merge 상태가 아닐 수 있습니다. git status로 현재 상태를 확인하고, 필요하면 git reset --merge로 병합 시작 전 상태로 되돌릴 수 있습니다.
Q3. 충돌이 자주 나는데 줄일 방법이 없나요?
자주 git pull(또는 fetch+merge)로 main의 최신 변경을 자기 브랜치에 반영하면 충돌 규모가 작아집니다. 또 한 파일을 여러 사람이 동시에 크게 고치지 않도록 작업을 나누는 것이 근본 해결책입니다.