테마
충돌 해결과 병합
충돌(Conflict)이란?
여러 사람이 같은 파일의 같은 부분을 동시에 수정하고 push할 때 발생하는 현상입니다. Git은 어떤 변경이 옳은지 스스로 판단할 수 없기 때문에, 개발자가 직접 해결해야 합니다.
충돌 발생 시나리오
시나리오 상세
- A와 B 모두
a.txt를 pull 받아 동기화한 상태 - A는 로컬에서
a.txt에 "a sentence"를 추가하고 커밋 - B도 로컬에서
a.txt에 "b sentence"를 추가하고 커밋 - B가 먼저 push → 원격 저장소에 "b sentence" 반영
- A가 push 시도 → 원격에 반영 안 된 변경사항(B의 커밋)이 있어서 거부됨
충돌 해결 프로세스
충돌 표식 이해하기
git pull 후 충돌이 발생하면, Git이 파일에 충돌 표식을 삽입합니다:
some sentence
another sentence
<<<<<<< HEAD
a sentence
=======
b sentence
>>>>>>> aa8b939| 표식 | 의미 |
|---|---|
<<<<<<< HEAD | 내 로컬 브랜치(현재 작업 공간)의 시작 |
======= | 내 변경사항과 원격 변경사항의 경계 |
>>>>>>> 해시값 | 원격 커밋의 변경사항 끝 |
충돌 해결 방법
충돌 표식을 보고 어떤 코드를 남길지 결정한 뒤, 표식을 제거합니다.
선택지 1: 둘 다 남기기
some sentence
another sentence
a sentence
b sentence선택지 2: 내 코드만 남기기
some sentence
another sentence
a sentence선택지 3: 원격 코드만 남기기
some sentence
another sentence
b sentence실습: 충돌 발생부터 해결까지
명령어 순서
bash
# 1. 로컬에서 파일 수정 및 커밋
vim a.txt
# → "a sentence" 추가
git add a.txt
git commit -m "add a sentence to a.txt"
# 2. push 시도 (실패)
git push
# ERROR: 원격에 반영 안 된 변경사항 있음
# 3. 원격 변경사항 가져오기
git pull
# CONFLICT in a.txt
# 4. 충돌 파일 열어서 해결
vim a.txt
# → 충돌 표식 확인
# → 남길 코드 결정
# → 표식 제거 후 저장 (:wq)
# 5. 해결 완료 표시
git add a.txt
# 6. 병합 커밋 생성 (메시지 자동 생성)
git commit
# → 자동 생성된 merge 메시지 확인 → :wq
# 7. 원격에 반영
git push병합 커밋의 메시지
충돌 해결 후 git commit을 하면 (-m 없이) Git이 자동으로 병합 메시지를 생성합니다. "Merge branch 'main' of github..." 같은 내용이 자동으로 채워지므로, 그대로 :wq로 저장하면 됩니다.
충돌 해결 요약
여러 사람들과 Git 작업을 하다 보면 충돌이 발생할 수밖에 없습니다. 충돌을 두려워하지 말고, 해결하는 과정을 자연스러운 협업의 일부로 받아들이세요.