협업을 하다 보면 언젠가 CONFLICT라는 무서운 단어를 만나게 됩니다. 병합 충돌(merge conflict)이죠. 처음 보면 '내가 뭔가 망쳤나' 싶어 겁이 나지만, 전혀 그렇지 않습니다. 충돌은 에러가 아니라, Git이 '이건 제가 함부로 판단 못 하겠으니 사람이 골라 주세요'라고 정중히 묻는 것입니다.
충돌은 왜 나나요?
충돌은 두 사람(또는 두 브랜치)이 같은 파일의 같은 줄을 서로 다르게 고쳤을 때만 납니다. 예를 들어 A는 제목을 '안녕하세요'로, B는 '반갑습니다'로 같은 줄을 고쳤다면, Git은 둘 중 무엇이 맞는지 알 수 없습니다. 서로 다른 파일이나 다른 줄을 고쳤다면 Git이 알아서 합치므로 충돌이 나지 않습니다.
충돌 마커 읽는 법
충돌이 나면 Git은 문제가 된 파일 안에 특별한 표시(마커)를 넣어 둡니다. 이 마커를 읽는 법만 알면 충돌 해결의 90%는 끝난 것입니다.
충돌이 표시된 파일 모습
<<<<<<< HEAD
안녕하세요
=======
반갑습니다
>>>>>>> feature/login
- <<<<<<< HEAD : 여기부터는 '지금 내 브랜치(HEAD)'의 내용입니다.
- ======= : 경계선. 위는 내 것, 아래는 상대 것.
- >>>>>>> feature/login : 여기까지가 '합쳐오는 브랜치'의 내용입니다.
- 해결이란: 이 마커 세 줄과, 버릴 쪽 내용을 지우고 '최종적으로 남길 코드'만 남기는 것입니다.
충돌 해결 절차
- git status 로 어떤 파일이 충돌났는지 확인합니다. (both modified 라고 표시됨)
- 그 파일을 편집기로 열어 <<<<<<<, =======, >>>>>>> 마커를 찾습니다.
- 두 내용을 보고 최종적으로 남길 코드만 남긴 뒤, 마커 세 줄을 모두 지웁니다. (둘 다 필요하면 둘 다 남기고 마커만 지워도 됩니다)
- 저장한 뒤 git add 파일명 으로 '해결했음'을 표시합니다.
- git commit 으로 병합을 마무리합니다. (메시지는 비워도 기본 병합 메시지가 채워집니다)
충돌이 무섭게 느껴진다면 VS Code 같은 편집기를 쓰세요. 충돌 부분에 'Accept Current(내 것)', 'Accept Incoming(상대 것)', 'Accept Both(둘 다)' 버튼을 색깔로 보여줘서, 마커를 손으로 지우지 않고 클릭만으로 해결할 수 있습니다.
.gitignore — 올리면 안 되는 파일 막기
모든 파일을 GitHub에 올려야 하는 것은 아닙니다. 자동으로 만들어지는 파일(node_modules 같은 라이브러리 폴더)이나, 절대 공개되면 안 되는 파일(비밀번호가 든 .env)은 올리지 말아야 합니다. 이런 파일 목록을 .gitignore라는 파일에 적어 두면, Git이 그 파일들을 아예 못 본 척 무시합니다.
.gitignore 예시 (프로젝트 루트에 이 이름으로 저장)
# 라이브러리 폴더 (용량 크고 자동 생성됨)
node_modules/
# 환경변수·비밀키 (절대 공개 금지!)
.env
.env.local
*.key
# OS·에디터가 만드는 자잘한 파일
.DS_Store
.vscode/
# 빌드 결과물
dist/
build/
비밀키·비밀번호·API 토큰을 실수로 커밋해 GitHub에 올리면, 나중에 지워도 커밋 기록에 영원히 남아 유출된 것으로 봐야 합니다. 반드시 작업 '시작 전에' .gitignore에 .env 같은 파일을 먼저 등록하세요. 이미 올려 버렸다면 그 키·토큰은 즉시 폐기(재발급)해야 합니다.
충돌도 이제 무섭지 않고, 올리면 안 될 파일도 막을 수 있게 됐습니다. 그런데 만약 실수로 파일을 망가뜨렸거나 잘못 커밋했다면 어떻게 할까요? 다음 레슨에서 '되돌리기'의 세계로 들어가 봅니다.