충돌(Conflict)
이 글의 목차
소요: 20분 (심화 포함 35분) · 버전: v0.1 (2026-09-30) · 10장
| 이 장의 질문 | 충돌은 왜 생기고 어떻게 대처하는가 |
|---|---|
| 다루는 것 | 충돌이 생기는 조건, 병합 전에 충돌을 미리 알아보는 법, 충돌이 나면 취소(Abort)하는 법. 심화: 직접 해결하기 |
| 다루지 않는 것 | 여러 파일에 걸친 복잡한 충돌 |
| 이 장을 마치면 | 충돌이 나도 당황하지 않고, 아무것도 망가뜨리지 않은 채 빠져나올 수 있습니다 |
1. 충돌은 같은 곳을 다르게 고쳤을 때 납니다
Git은 두 브랜치의 변경을 대부분 알아서 합칩니다. 합치지 못하는 경우는 하나입니다.
같은 파일의 같은 줄을 양쪽에서 다르게 고쳤을 때
이때 Git은 어느 쪽이 맞는지 판단하지 않고 사람에게 묻습니다. 이것이 충돌(conflict) 입니다. 고장이 아니라 질문입니다.
| 상황 | 결과 |
|---|---|
| work는 README, main은 회의록 양식을 고침 | 자동으로 합쳐짐 |
| 같은 README라도 work는 3번째 줄, main은 10번째 줄을 고침 | 자동으로 합쳐짐 |
| work와 main이 같은 줄을 다르게 고침 | 충돌 |
2. 기본 대처: 병합 전에 확인하고, 충돌이 나면 취소
충돌은 PR 화면에서 처음 발견하기도 합니다(This branch has conflicts that must be resolved). 그때 웹에서 해결하려 하지 말고, GitHub Desktop에서 main을 work로 먼저 합쳐 보는 방법을 씁니다. GitHub Desktop은 합치기 전에 충돌이 날지 미리 알려 줍니다.
충돌이 났을 때 기본 대처는 취소(Abort merge) 입니다. 취소하면 병합을 시작하기 직전으로 돌아가고, 아무것도 바뀌지 않습니다. 해결은 익숙해진 뒤에, 또는 경험자와 함께 합니다.
3. 실습 1: 일부러 충돌 만들기
시작 상태: Current Branch 가 work, Changes가 비어 있음.
3-1. main 쪽 고치기 (웹에서)
웹에서 main을 직접 고치는 것은 이 연습을 위해서입니다. 평소에는 main에 직접 커밋하지 않습니다.
-
브라우저에서 저장소를 엽니다. 파일 목록 위의 브랜치 표시가 main 인지 확인합니다.
-
README.md→ 연필 아이콘 을 누르고, 소개 문장 끝에(B)를 붙입니다.- Git 연습용 저장소입니다. + Git 연습용 저장소입니다. (B) -
Commit changes… → 메모
소개 문장에 B 표시→ Commit directly to the main branch 가 선택된 채로 Commit changes 를 누릅니다.
3-2. work 쪽 고치기 (내 PC에서)
-
GitHub Desktop에서 Current Branch 가
work인지 확인합니다. -
VS Code에서
README.md의 같은 문장 끝에(A)를 붙이고 저장합니다.- Git 연습용 저장소입니다. + Git 연습용 저장소입니다. (A) -
메모
소개 문장에 A 표시로 커밋합니다. 푸시는 아직 하지 않습니다.
3-3. 내 PC의 main 받기
- Current Branch → main → Fetch origin → Pull origin. 내 PC의 main에
(B)가 들어옵니다. - Current Branch → work 로 돌아옵니다.
4. 실습 2: 합쳐 보고, 취소하기
- Current Branch 를 누르고 목록 아래의 Choose a branch to merge into work 를 누릅니다.
- 목록에서
main을 고릅니다. - 창 아래에 빨간색으로 There will be 1 conflicted file when merging main into work 가 나옵니다. 충돌 예고입니다.
- 실제 작업에서는 여기서 멈추고 창을 닫는 것이 가장 안전합니다. 이번에는 연습이므로 진행합니다.
- Create a merge commit 을 누릅니다.
9장에서 쓴 Branch → Update from main 도 같은 일(main을 work에 합치기)을 합니다. 다만 충돌 예고 없이 바로 합치므로, 충돌이 날 것 같을 때는 이 절의 방법으로 먼저 확인하는 편이 좋습니다.
- Resolve conflicts before Merge 창이 뜹니다.
README.md에1 conflict가 표시됩니다. - Abort merge 를 누릅니다. 확인 창이 나오면 한 번 더 Abort merge 를 누릅니다.
Changes가 비어 있고, History에는 소개 문장에 A 표시 가 그대로 있습니다. 병합을 시작하기 전 상태로 돌아왔습니다.
Abort merge를 누를 수 없는 상황이 올 수 있나요? 창을 닫아 버렸다면, GitHub Desktop 가운데에 충돌 안내와 Abort merge 버튼이 계속 보입니다. 거기서 누릅니다.
5. 실습 정리하기
심화를 하지 않는다면 이렇게 정리합니다. 심화를 할 거라면 이 절을 건너뛰고 6절로 갑니다.
- History 에서
소개 문장에 A 표시를 오른쪽 클릭 → Revert Changes in Commit (7장). - 메뉴 Branch → Update from main 을 누릅니다. 이번에는 충돌 없이 합쳐집니다.
- Push origin 을 누릅니다.
work가 main의 (B) 까지 받은 상태가 되어, 다음 PR에서 충돌이 나지 않습니다.
6. 심화: 충돌 직접 해결하기
이 절은 선택입니다. 충돌이 난 파일이 하나이고, 두 내용 중 무엇이 맞는지 내가 판단할 수 있을 때만 합니다. 판단이 안 서면 Abort merge가 정답입니다.
4절 1~5를 다시 해서 Resolve conflicts before Merge 창을 띄웁니다.
README.md옆의 Open in editor(또는 Open in Visual Studio Code)를 누릅니다.- VS Code에 아래처럼 충돌 표시가 들어간 파일이 열립니다.
<<<<<<< HEAD (Current Change)
Git 연습용 저장소입니다. (A)
=======
Git 연습용 저장소입니다. (B)
>>>>>>> main (Incoming Change)
| 표시 | 뜻 |
|---|---|
<<<<<<< 부터 ======= 까지 | 지금 브랜치(work)의 내용 |
======= 부터 >>>>>>> 까지 | 합치려는 브랜치(main)의 내용 |
-
위쪽의 버튼 하나를 누릅니다.
버튼 결과 Accept Current Change Git 연습용 저장소입니다. (A)만 남음Accept Incoming Change Git 연습용 저장소입니다. (B)만 남음Accept Both Changes 두 줄이 모두 남음. 필요 없는 줄을 손으로 지움 이번에는 Accept Both Changes 를 누르고, 두 줄을
Git 연습용 저장소입니다. (A)(B)한 줄로 고쳐 봅니다. -
<<<<<<<,=======,>>>>>>>가 하나도 남지 않았는지 확인하고 저장합니다. -
GitHub Desktop 창으로 돌아오면
README.md옆에 No conflicts remaining 이 보입니다. -
Continue merge 를 누릅니다. 병합 커밋이 만들어집니다.
-
Push origin 을 누릅니다.
이제 work에는 main의 변경과 충돌 해결 결과가 모두 들어 있습니다. 이 상태로 PR을 만들면 충돌 없이 병합할 수 있습니다. 원하면 9장 방법으로 PR을 만들어 병합해 봅니다.
확인
확인 문제
① work에서 README를, main에서 회의록 양식을 고쳤습니다. 합칠 때 충돌이 날까요?
나지 않습니다. 서로 다른 파일이라 Git이 자동으로 합칩니다.② 충돌 창이 떴는데 어느 쪽이 맞는지 모르겠습니다. 무엇을 누르나요?
Abort merge입니다. 병합 직전으로 돌아가고 아무것도 바뀌지 않습니다.③ 충돌을 해결하고 저장했는데 Continue merge가 눌리지 않습니다. 무엇을 확인하나요?
파일에 <<<<<<<, =======, >>>>>>> 표시가 남아 있는지, 저장했는지 확인합니다.자주 발생하는 문제
| 증상 | 확인할 것 |
|---|---|
| 충돌 예고가 나오지 않고 바로 합쳐졌습니다 | 3절에서 같은 문장을 고치지 않았거나, main을 받지 않았습니다. 3-3을 확인합니다 |
| 충돌 창을 닫아 버렸습니다 | GitHub Desktop 가운데의 안내에서 Abort merge 를 누릅니다 |
| 충돌 표시가 남은 채로 커밋·푸시했습니다 | GitHub에서 파일을 열어 <<<<<<< 가 보이면, VS Code에서 표시를 지우고 올바른 내용으로 고쳐 다시 커밋·푸시합니다 |
| 충돌 파일이 여러 개입니다 | Abort merge 후 경험자에게 도움을 요청합니다 |