Git 충돌(merge conflict) 해결 방법
git pull이나 git merge를 했는데 “CONFLICT (content): Merge conflict in …”이 뜨면 처음에는 당황하게 된다. 하지만 충돌은 고장이 아니라, 같은 곳을 두 사람이(또는 두 브랜치가) 다르게 고쳐서 Git이 어느 쪽을 택할지 물어보는 것뿐이다. 이 글에서는 Git 충돌 해결 순서를 merge와 rebase로 나눠 정리한다. Git 기본 명령은 Git 사용법 기초에 먼저 정리해 두었다.

충돌은 언제 생기나
- 두 브랜치가 같은 파일의 같은 줄을 서로 다르게 고쳤을 때
- 한쪽은 파일을 고치고 다른 쪽은 그 파일을 지웠을 때
- 내가 커밋하지 않은 변경이 있는 상태에서 pull 할 때(이때는 충돌 전에 거부되기도 한다)
Git 충돌 해결 1단계 상태 확인
git merge feature/login
# CONFLICT (content): Merge conflict in config.php
# Automatic merge failed; fix conflicts and then commit the result.
git status
# Unmerged paths:
# both modified: config.php
git status에서 “both modified”로 표시된 파일이 직접 고쳐야 할 파일이다.
Git 충돌 해결 2단계 충돌 표시 읽기
<<<<<<< HEAD
$timeout = 30;
=======
$timeout = 60;
>>>>>>> feature/login
| 표시 | 뜻 |
|---|---|
<<<<<<< HEAD | 여기부터 현재 브랜치(내 쪽) 내용 |
======= | 구분선 |
>>>>>>> feature/login | 여기까지 합치려는 브랜치 내용 |
둘 중 하나를 고르거나, 둘을 합쳐 새로 쓰고, 표시 세 줄(<<<, ===, >>>)은 모두 지운다. 예를 들어 60이 맞다면 $timeout = 60; 한 줄만 남긴다.
Git 충돌 해결 3단계 표시하고 커밋
# 고친 파일을 해결됨으로 표시
git add config.php
# 남은 충돌이 없는지 확인
git status
# merge 마무리
git commit
한쪽 내용을 통째로 택하기
# 내 쪽(현재 브랜치) 버전으로
git checkout --ours config.php
# 합치려는 브랜치 버전으로
git checkout --theirs config.php
git add config.php
없던 일로 되돌리기
git merge --abort
충돌을 정리하다가 꼬였다면 merge –abort로 merge를 시작하기 전 상태로 돌아갈 수 있다.
rebase 중 충돌
rebase는 내 커밋을 하나씩 다시 쌓기 때문에, 커밋마다 충돌이 날 수 있다. 해결 방법은 같고 마무리 명령만 다르다. 또 rebase에서는 –ours와 –theirs의 의미가 merge와 반대로 느껴진다는 점에 주의하자. 기준이 되는 브랜치가 “ours”가 되기 때문이다.
git rebase main
# 충돌 → 파일 수정 → git add 파일
git rebase --continue
# 이 커밋은 건너뛰기
git rebase --skip
# 전체 취소
git rebase --abort
충돌을 줄이는 습관
- 작업 전에 git pull로 최신 상태를 받는다.
- 커밋은 작게, 자주 한다.
- 한 파일을 여러 사람이 동시에 크게 고치지 않도록 작업을 나눈다.
- 줄 끝 공백이나 들여쓰기 같은 서식 변경은 기능 변경과 따로 커밋한다.
VS Code 같은 편집기는 충돌 부분에 “현재 변경 사항 수락”, “들어오는 변경 사항 수락” 버튼을 보여 줘서 더 쉽게 고를 수 있다. merge 옵션 전체는 git merge 공식 문서에 있다.
Git 충돌 해결 정리
git status로 충돌 파일 찾기, 표시를 지우고 내용 정하기, git add 후 commit(또는 rebase –continue). 막히면 –abort로 되돌아가면 되니 겁낼 필요가 없다. 서버 설정을 링크로 관리하는 방법은 전날 글인 심볼릭 링크 사용법에 있다.
첫 댓글을 남겨보세요