여러 명이 같은 코드를 건드리면 반드시 만나는 벽, 머지 충돌.
오늘은 혼자서 브랜치 2개로 충돌을 일부러 만들고, 마커를 읽어 손으로·AI로 해결하는 워크북입니다.
Week 13에서 혼자서 git 전 과정(커밋·복구·브랜치·Merge)을 손으로 통과했습니다. 실무에서 그 다음 벽은 여러 명이 같은 파일을 동시에 고칠 때 생기는 머지 충돌(merge conflict)입니다. 오늘은 이 충돌을 일부러 만들고, 마커를 읽어 직접 해결합니다.
Week 13 = 혼자 요리하기 🍳
Week 14 = 공동 주방에서 같이 요리하기 👥🍳 두 요리사가 같은 냄비를 동시에 건드리면 부딪칩니다(충돌). 오늘은 부딪쳤을 때 깔끔히 정리하는 법을 배웁니다.
git --version 입력 → 버전이 나오면 OK오늘 바로 쓰는 용어만 딱 4개 복습합니다. 자세한 설명은 Week 13에 있으니, 여기서는 "한 줄 뜻 + 오늘 어디에 쓰는지"만 확인하세요.
| 용어 | 한 줄 뜻 | 오늘 실습에서 |
|---|---|---|
| Branch (브랜치) | 원본을 안 건드리는 작업 사본 | "나"·"동료" 두 갈래를 만든다 |
| Merge (머지) | 브랜치를 main에 합치기 | 두 갈래를 합치다가 충돌 발생 |
| Pull Request (PR) | "합쳐주세요" 요청서 | 웹에서 충돌 배너를 만난다 |
| Pull (풀) | GitHub → 내 PC 내려받기 | 충돌 예방의 1순위 습관 |
<<<<<<< · ======= · >>>>>>> — 충돌 지점에 Git이 자동으로 넣어주는 표시
Week 13에서 만든 todo-app에서 시작합니다. 앱의 제목 줄 <h2>📝 할일 메모장</h2>을 오늘의 "충돌 지점"으로 삼습니다. 두 브랜치가 이 같은 줄을 서로 다르게 고치게 만들 거예요.
브랜치 '나' / 브랜치 '동료' =
한 문서를 각자 사본으로 복사해, 같은 문단을 동시에 손보는 두 사람. 나중에 하나로 합칠 때 부딪칩니다.
git branch를 입력했을 때 목록에 feature/title-mine이 보이고 별표(*)가 거기 있으면, 충돌 실습 무대가 준비된 것입니다.
이번이 충돌의 씨앗을 심는 핵심 단계입니다. 두 브랜치가 같은 제목 줄을 서로 다르게 고치게 만듭니다.
지금 feature/title-mine에 있습니다. todo.html의 제목을 이렇게 바꾸세요.
feature/title-mine과 feature/title-coworker 두 브랜치에 각각 커밋이 하나씩 생겼다면(git log --oneline으로 확인), 충돌의 씨앗을 심은 것입니다.
이제 두 브랜치를 차례로 main에 합칩니다. 첫 번째는 조용히 성공하지만, 두 번째에서 충돌이 터집니다.
git status로 확인하면, 충돌한 파일이 "Unmerged paths"에 뜹니다.
CONFLICT (content) 메시지가 떴다면 충돌을 성공적으로 재현한 것입니다. 실습이니까 축하할 일이에요. 이제 해결만 하면 됩니다. 🎉
충돌이 나면 Git은 todo.html의 충돌 지점에 마커 3형제를 자동으로 넣습니다. 겁먹지 말고 색으로 뜯어봅시다. 파일을 열면 그 줄이 이렇게 되어 있습니다.
즉: <<<<<<< HEAD ~ ======= 사이는 내 코드, ======= ~ >>>>>>> 사이는 동료 코드. 이 중 무엇을 남길지 내가 정하면 됩니다.
📝 나의 할일 메모장만 남긴다✅ 오늘 할일 체크만 남긴다📝 오늘의 할일 메모장)Cursor는 충돌 지점 위에 Accept Current Change / Incoming Change / Both Changes 버튼을 띄워줍니다. 버튼을 눌러도 되고, 직접 손으로 고쳐도 됩니다.
<<<<<<< HEAD, =======, >>>>>>> feature/title-coworker 세 줄을 전부 삭제하고, 남길 제목 한 줄만 남깁니다.
<<<<<<< · ======= · >>>>>>> 중 하나라도 파일에 남으면, 그 글자가 그대로 코드에 섞여 화면이 깨집니다.
git status가 nothing to commit, working tree clean으로 바뀌고, todo.html을 브라우저로 열었을 때 제목이 정상으로 하나만 보이면 충돌 해결 완료입니다.
마커를 직접 지우는 게 헷갈린다면 AI에게 맡길 수 있습니다. Cursor Agent나 Codex CLI는 충돌 파일을 읽고 해결안을 만들어 줍니다. 단, 결과는 반드시 사람이 눈으로 확인해야 합니다.
| 하고 싶은 것 | 이렇게 말하면 됩니다 |
|---|---|
| 충돌 파일 확인 | "지금 어떤 파일에 충돌이 났는지 알려줘" |
| 내 것으로 해결 | "충돌을 내 쪽(HEAD) 코드로 해결해줘" |
| 동료 것으로 해결 | "충돌을 들어오는 쪽 코드로 해결해줘" |
| 둘을 합치기 | "두 변경을 자연스럽게 하나로 합쳐서 해결해줘" |
| merge 자체 취소 | "이번 merge를 취소하고 충돌 전으로 되돌려줘" |
todo.html을 브라우저로 열어 실제로 동작하는지 본 다음 커밋하세요. 충돌 해결은 AI도 틀릴 수 있고, 마커가 덜 지워지거나 엉뚱한 쪽을 남길 수 있습니다.
실무에서는 충돌을 GitHub 웹의 PR 화면에서 마주치는 경우가 많습니다. PR에 "This branch has conflicts that must be resolved" 배너가 뜨면, 아래 순서로 해결합니다.
Merge 버튼이 회색으로 잠기고 "conflicts must be resolved" 안내가 보입니다. 놀라지 말고, 로컬에서 해결하는 게 가장 안전합니다.
push하면 PR의 충돌 배너가 사라지고 Merge 버튼이 초록으로 살아납니다.
git pull — 최신 상태에서 출발혼자 시뮬로 충돌 해결 능력은 이미 완성됐습니다. 여기서 한 걸음 더 나가 2명이 짝을 지어 실제 협업 충돌을 재현해 봅니다.
todo-app 레포 → Settings → Collaborators → Add people → B의 GitHub 계정 초대. B가 이메일/알림에서 수락하면 함께 push할 수 있습니다.
둘 다 git clone → 각자 todo.html의 같은 제목 줄을 다르게 고쳐 add → commit → push.
먼저 push한 사람은 성공. 두 번째 사람은 push가 거절되고, git pull하는 순간 충돌 발생 → 실습 4 방식으로 함께 해결하면 됩니다.
git merge --abort는 뭐예요?git merge --abort를 치면 마커가 다 사라지고 충돌 전 상태로 돌아가니, 마음 편히 다시 시도할 수 있습니다.
git merge --abort로 처음부터 다시 하거나, AI에게 "충돌 해결을 처음부터 다시 해줘"라고 맡기면 됩니다. 커밋 전이라면 언제든 되돌릴 수 있습니다.
git pull로 최신 상태를 유지하고, 작은 단위로 PR을 올리고, 같은 파일은 미리 나눠서 작업하면 충돌 빈도가 확 낮아집니다(→ 실습 6의 팀 습관 4가지).
오늘 6개의 실습을 통과했다면, "혼자 하는 git"을 넘어 "팀으로 하는 git"의 핵심을 손으로 한 바퀴 돈 것입니다. 스스로 점검해 보세요.
💥 충돌! (CONFLICT) │ ├─▶ git status로 충돌 파일 확인 │ ├─▶ 마커 3형제 찾기 <<<<<<< ======= >>>>>>> │ ├─▶ 남길 코드로 정리 + 마커 3줄 삭제 │ └─▶ git add → git commit ──▶ ✅ 해결! ┌─ 꼬였다면? ──▶ git merge --abort (안전 탈출, 처음부터)
충돌은 실패가 아니라 협업의 증거입니다.
마커 3줄만 정리하면 되고, 꼬이면git merge --abort로 언제든 돌아올 수 있습니다. 이제 팀으로 코딩할 준비가 끝났습니다. 🤝