팀으로 코딩하기
브랜치 충돌(Conflict) 만들고 해결하기

여러 명이 같은 코드를 건드리면 반드시 만나는 벽, 머지 충돌.
오늘은 혼자서 브랜치 2개로 충돌을 일부러 만들고, 마커를 읽어 손으로·AI로 해결하는 워크북입니다.

🎯 오늘 우리가 손으로 할 것

Week 13에서 혼자서 git 전 과정(커밋·복구·브랜치·Merge)을 손으로 통과했습니다. 실무에서 그 다음 벽은 여러 명이 같은 파일을 동시에 고칠 때 생기는 머지 충돌(merge conflict)입니다. 오늘은 이 충돌을 일부러 만들고, 마커를 읽어 직접 해결합니다.

🌿 두 브랜치로 나누기 ✏️ 같은 줄 다르게 수정 💥 충돌 재현 🔧 손으로 해결 🤖 AI로 해결 🔀 PR 충돌 정복
Week 13 = 혼자 요리하기 🍳
Week 14 = 공동 주방에서 같이 요리하기 👥🍳 두 요리사가 같은 냄비를 동시에 건드리면 부딪칩니다(충돌). 오늘은 부딪쳤을 때 깔끔히 정리하는 법을 배웁니다.

시작 전 준비물 체크

오늘은 혼자서도 100% 재현됩니다. 팀원을 기다릴 필요 없이, 브랜치 2개를 "나"와 "동료"처럼 써서 충돌을 만듭니다. 진짜 짝꿍과 해보고 싶다면 마지막 확장 실습에서 다룹니다.

📚 30초 복습 + 새 용어 예고

오늘 바로 쓰는 용어만 딱 4개 복습합니다. 자세한 설명은 Week 13에 있으니, 여기서는 "한 줄 뜻 + 오늘 어디에 쓰는지"만 확인하세요.

용어 한 줄 뜻 오늘 실습에서
Branch (브랜치)원본을 안 건드리는 작업 사본"나"·"동료" 두 갈래를 만든다
Merge (머지)브랜치를 main에 합치기두 갈래를 합치다가 충돌 발생
Pull Request (PR)"합쳐주세요" 요청서웹에서 충돌 배너를 만난다
Pull (풀)GitHub → 내 PC 내려받기충돌 예방의 1순위 습관
오늘 새로 배울 용어:
Conflict (충돌) = 두 갈래가 같은 줄을 다르게 고쳐서, Git이 "누구 걸 쓸지" 스스로 못 정하는 상태
충돌 마커 3형제 = <<<<<<< · ======= · >>>>>>> — 충돌 지점에 Git이 자동으로 넣어주는 표시
Collaborator (공동 작업자) = 내 레포에 초대해 함께 push할 수 있는 팀원 (확장 실습에서 사용)

실습 1🌿 충돌 실습 무대 만들기

Week 13에서 만든 todo-app에서 시작합니다. 앱의 제목 줄 <h2>📝 할일 메모장</h2>을 오늘의 "충돌 지점"으로 삼습니다. 두 브랜치가 이 같은 줄을 서로 다르게 고치게 만들 거예요.

브랜치 '나' / 브랜치 '동료' =
한 문서를 각자 사본으로 복사해, 같은 문단을 동시에 손보는 두 사람. 나중에 하나로 합칠 때 부딪칩니다.
# ① todo-app 폴더에서 시작, main 최신 상태 확인 cd todo-app git checkout main git pull origin main # ② "나" 브랜치를 만들고 이동 (아직 수정은 안 함) git checkout -b feature/title-mine
✅ 이렇게 되면 성공: git branch를 입력했을 때 목록에 feature/title-mine이 보이고 별표(*)가 거기 있으면, 충돌 실습 무대가 준비된 것입니다.

실습 2✏️ 같은 줄을 서로 다르게 고치기

이번이 충돌의 씨앗을 심는 핵심 단계입니다. 두 브랜치가 같은 제목 줄을 서로 다르게 고치게 만듭니다.

① "나" 브랜치에서 제목 수정 + 커밋

지금 feature/title-mine에 있습니다. todo.html의 제목을 이렇게 바꾸세요.

# todo.html에서 제목 줄을 이렇게 수정: # <h2>📝 할일 메모장</h2> → <h2>📝 나의 할일 메모장</h2> git add todo.html git commit -m "feat: 제목을 '나의 할일 메모장'으로 변경"

② main으로 돌아가 "동료" 브랜치에서 같은 줄을 다르게 수정

# main에서 새로 갈라져 나온 "동료" 브랜치 생성 git checkout main git checkout -b feature/title-coworker # 같은 제목 줄을 이번엔 다르게 수정: # <h2>📝 할일 메모장</h2> → <h2>✅ 오늘 할일 체크</h2> git add todo.html git commit -m "feat: 제목을 '오늘 할일 체크'로 변경"
핵심은 "같은 줄"입니다. 두 브랜치가 서로 다른 줄을 고쳤다면 Git이 알아서 합쳐서 충돌이 안 납니다. 오늘은 일부러 똑같은 제목 줄을 두 갈래가 다르게 고쳤기 때문에 충돌이 예약된 상태입니다.
✅ 이렇게 되면 성공: feature/title-minefeature/title-coworker 두 브랜치에 각각 커밋이 하나씩 생겼다면(git log --oneline으로 확인), 충돌의 씨앗을 심은 것입니다.

실습 3💥 충돌 재현하기

이제 두 브랜치를 차례로 main에 합칩니다. 첫 번째는 조용히 성공하지만, 두 번째에서 충돌이 터집니다.

git checkout main # 첫 번째 merge — 조용히 성공 (main엔 아직 변화가 없었으니까) git merge feature/title-mine Updating a1b2c3d..e4f5g6h Fast-forward todo.html | 2 +- # 두 번째 merge — 같은 줄이 이미 바뀐 상태라 💥 충돌! git merge feature/title-coworker Auto-merging todo.html CONFLICT (content): Merge conflict in todo.html Automatic merge failed; fix conflicts and then commit the result.

git status로 확인하면, 충돌한 파일이 "Unmerged paths"에 뜹니다.

git status You have unmerged paths. (fix conflicts and run "git commit") Unmerged paths: (use "git add <file>..." to mark resolution) both modified: todo.html
✅ 이렇게 되면 성공: 빨간 CONFLICT (content) 메시지가 떴다면 충돌을 성공적으로 재현한 것입니다. 실습이니까 축하할 일이에요. 이제 해결만 하면 됩니다. 🎉

실습 4🔧 충돌 마커 읽고 손으로 해결

충돌이 나면 Git은 todo.html의 충돌 지점에 마커 3형제를 자동으로 넣습니다. 겁먹지 말고 색으로 뜯어봅시다. 파일을 열면 그 줄이 이렇게 되어 있습니다.

<<<<<<< HEAD ← 여기부터 내 코드(main에 먼저 merge된 '나') <h2>📝 나의 할일 메모장</h2> ======= ← 경계선 <h2>✅ 오늘 할일 체크</h2> >>>>>>> feature/title-coworker ← 여기까지 들어오려는 코드('동료')

즉: <<<<<<< HEAD ~ ======= 사이는 내 코드, ======= ~ >>>>>>> 사이는 동료 코드. 이 중 무엇을 남길지 내가 정하면 됩니다.

해결 방법 3가지 중 하나를 고른다

1
에디터로 todo.html 열기

Cursor는 충돌 지점 위에 Accept Current Change / Incoming Change / Both Changes 버튼을 띄워줍니다. 버튼을 눌러도 되고, 직접 손으로 고쳐도 됩니다.

2
마커 3줄을 모두 지우고 최종 제목 하나로 정리

<<<<<<< HEAD, =======, >>>>>>> feature/title-coworker 세 줄을 전부 삭제하고, 남길 제목 한 줄만 남깁니다.

3
해결한 파일을 담고 merge 커밋 완성
git add todo.html git commit # 기본 merge 메시지 그대로 저장하면 됨
⚠️ 반드시 마커 3줄을 다 지우세요. <<<<<<< · ======= · >>>>>>> 중 하나라도 파일에 남으면, 그 글자가 그대로 코드에 섞여 화면이 깨집니다.
✅ 이렇게 되면 성공: git statusnothing to commit, working tree clean으로 바뀌고, todo.html을 브라우저로 열었을 때 제목이 정상으로 하나만 보이면 충돌 해결 완료입니다.

실습 5🤖 AI에게 충돌 해결 시키기

마커를 직접 지우는 게 헷갈린다면 AI에게 맡길 수 있습니다. Cursor Agent나 Codex CLI는 충돌 파일을 읽고 해결안을 만들어 줍니다. 단, 결과는 반드시 사람이 눈으로 확인해야 합니다.

Cursor Agent / Codex 프롬프트
"todo.html에 merge 충돌이 났어. 두 제목을 자연스럽게 하나로 합쳐서 충돌을 해결하고 커밋해줘"
하고 싶은 것 이렇게 말하면 됩니다
충돌 파일 확인"지금 어떤 파일에 충돌이 났는지 알려줘"
내 것으로 해결"충돌을 내 쪽(HEAD) 코드로 해결해줘"
동료 것으로 해결"충돌을 들어오는 쪽 코드로 해결해줘"
둘을 합치기"두 변경을 자연스럽게 하나로 합쳐서 해결해줘"
merge 자체 취소"이번 merge를 취소하고 충돌 전으로 되돌려줘"
AI가 해결한 뒤엔 꼭 눈으로 확인: todo.html을 브라우저로 열어 실제로 동작하는지 본 다음 커밋하세요. 충돌 해결은 AI도 틀릴 수 있고, 마커가 덜 지워지거나 엉뚱한 쪽을 남길 수 있습니다.

실습 6🔀 PR에서 충돌 만나기 + 팀 규칙

실무에서는 충돌을 GitHub 웹의 PR 화면에서 마주치는 경우가 많습니다. PR에 "This branch has conflicts that must be resolved" 배너가 뜨면, 아래 순서로 해결합니다.

1
PR을 열고 충돌 배너 확인

Merge 버튼이 회색으로 잠기고 "conflicts must be resolved" 안내가 보입니다. 놀라지 말고, 로컬에서 해결하는 게 가장 안전합니다.

2
로컬에서 최신 main을 받아 충돌 해결
# 내 작업 브랜치에서 최신 main을 끌어와 충돌을 낸다 git checkout feature/내-브랜치 git pull origin main # → 충돌 발생 → 실습 4 방식으로 마커 정리 → add → commit
3
해결본을 push하면 PR이 자동 갱신
git push origin feature/내-브랜치

push하면 PR의 충돌 배너가 사라지고 Merge 버튼이 초록으로 살아납니다.

🛡️ 충돌을 줄이는 팀 습관 4가지

  • 작업 시작 전 항상 git pull — 최신 상태에서 출발
  • 브랜치는 짧게 유지 — 오래 묵힐수록 충돌이 커진다
  • 작은 단위로 자주 커밋·PR — 한 번에 몰아치지 않기
  • 같은 파일을 동시에 만질 땐 미리 나눠서 작업
✅ 이렇게 되면 성공: PR 화면이 "Able to merge" 초록 상태로 바뀌고 Merge까지 마치면, 팀 협업 한 바퀴를 완주한 것입니다.

👥 [확장 실습] 진짜 짝꿍과 해보기 (옵션)

혼자 시뮬로 충돌 해결 능력은 이미 완성됐습니다. 여기서 한 걸음 더 나가 2명이 짝을 지어 실제 협업 충돌을 재현해 봅니다.

1
A가 B를 Collaborator로 초대

todo-app 레포 → Settings → Collaborators → Add people → B의 GitHub 계정 초대. B가 이메일/알림에서 수락하면 함께 push할 수 있습니다.

2
A·B가 각자 clone 후 같은 줄을 다르게 수정

둘 다 git clone → 각자 todo.html같은 제목 줄을 다르게 고쳐 add → commit → push.

3
나중에 push한 사람이 충돌을 만난다

먼저 push한 사람은 성공. 두 번째 사람은 push가 거절되고, git pull하는 순간 충돌 발생 → 실습 4 방식으로 함께 해결하면 됩니다.

인원이 안 맞으면 이 확장은 건너뛰어도 됩니다. 메인 실습(혼자 시뮬)만으로 충돌을 읽고 해결하는 능력은 이미 갖춰졌습니다. 짝꿍 실습은 "진짜 팀 느낌"을 체험하는 보너스입니다.

❓ 자주 묻는 질문

Q 충돌이 나면 제가 뭔가 잘못한 건가요?
아닙니다. 충돌은 협업에서 지극히 정상인 상황입니다. 두 사람이 같은 줄을 고쳤을 때 Git이 "누구 걸 쓸지 나는 못 정하겠어, 사람이 정해줘"라고 표시하는 것뿐입니다. 잘 해결하면 오히려 협업을 제대로 하고 있다는 증거입니다.
Q git merge --abort는 뭐예요?
충돌 해결이 꼬였을 때 merge 시작 전으로 완전히 되돌리는 안전 탈출 버튼입니다. git merge --abort를 치면 마커가 다 사라지고 충돌 전 상태로 돌아가니, 마음 편히 다시 시도할 수 있습니다.
Q 마커를 지우다 실수로 코드를 망쳤어요.
당황하지 마세요. git merge --abort로 처음부터 다시 하거나, AI에게 "충돌 해결을 처음부터 다시 해줘"라고 맡기면 됩니다. 커밋 전이라면 언제든 되돌릴 수 있습니다.
Q Cursor의 Accept Current / Incoming / Both 차이가 뭐예요?
Current는 내 것(HEAD, 초록), Incoming은 들어오는 상대 것(파랑), Both는 둘 다 순서대로 남깁니다. 셋 다 마커는 자동으로 지워줍니다. 다만 "둘을 자연스럽게 하나로 합치기"는 버튼만으로 안 되므로, 그럴 땐 직접 편집하거나 AI에게 맡기세요.
Q 충돌을 아예 안 나게 할 순 없나요?
완전한 예방은 불가능하지만 크게 줄일 수는 있습니다. 자주 git pull로 최신 상태를 유지하고, 작은 단위로 PR을 올리고, 같은 파일은 미리 나눠서 작업하면 충돌 빈도가 확 낮아집니다(→ 실습 6의 팀 습관 4가지).

🎓 실습 완료 체크리스트 & 요약

오늘 6개의 실습을 통과했다면, "혼자 하는 git"을 넘어 "팀으로 하는 git"의 핵심을 손으로 한 바퀴 돈 것입니다. 스스로 점검해 보세요.

오늘의 실습 체크리스트

  • 실습 1 — 두 브랜치로 충돌 무대 만들기
  • 실습 2 — 같은 줄을 다르게 고쳐 씨앗 심기
  • 실습 3 — merge로 충돌 재현하기
  • 실습 4 — 마커 3형제 읽고 손으로 해결
  • 실습 5 — AI에게 충돌 해결 시키기
  • 실습 6 — PR 충돌 정복 + 팀 습관
  • (확장) 짝꿍과 실제 협업 충돌 재현

충돌 해결 흐름 한눈에 (다이어그램)

💥 충돌! (CONFLICT)
   │
   ├─▶  git status로 충돌 파일 확인
   │
   ├─▶  마커 3형제 찾기  <<<<<<<  =======  >>>>>>>
   │
   ├─▶  남길 코드로 정리 + 마커 3줄 삭제
   │
   └─▶  git addgit commit  ──▶  ✅ 해결!

  ┌─ 꼬였다면?  ──▶  git merge --abort  (안전 탈출, 처음부터)

전체 흐름 한눈에

두 갈래 같은 줄 수정 💥 충돌 마커 해결 add · commit PR Merge
충돌은 실패가 아니라 협업의 증거입니다.
마커 3줄만 정리하면 되고, 꼬이면 git merge --abort로 언제든 돌아올 수 있습니다. 이제 팀으로 코딩할 준비가 끝났습니다. 🤝