| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 조건문
- front-end
- back-end
- 개발자
- state
- javascript
- file upload
- jpa
- Kotlin
- component
- 상속
- props
- Sequelize
- 반복문
- spring boot
- AWS
- Producer
- vue
- restful api
- It
- 개발이 취미인 사람
- kafka
- Nest.js
- node.js
- react
- 개발이취미인사람
- swagger
- SWIFT
- java
- 코틀린
- Today
- Total
개발이 취미인 사람
[Git] - 충돌(Conflict) 해결 방법 본문
개요
안녕하세요. 이번 시간에는 Git 충돌(Conflict) 해결 방법에 대해 알아보겠습니다. 여러 사람이 협업하다 보면 같은 파일의 같은 부분을 수정하는 경우가 발생합니다. 이때 Git은 자동으로 병합하지 못하고 충돌이 발생하게 됩니다. 충돌을 두려워하지 말고, 해결 방법을 익혀두면 자신있게 대처할 수 있습니다. 혹시 이전 시간에 내용을 학습하고 오시지 못 하신 분들은 학습하고 오시는 걸 추천드리겠습니다.
- 충돌이란?
충돌(Conflict)은 Git이 자동으로 병합할 수 없는 상황을 말합니다. 두 브랜치에서 같은 파일의 같은 라인을 다르게 수정했을 때 발생합니다.

충돌이 발생하는 상황
main 브랜치:
파일: greeting.js
내용: console.log("Hello"); → console.log("Hello World");
feature 브랜치:
파일: greeting.js
내용: console.log("Hello"); → console.log("Hello Git");
병합 시도 시:
Git: "둘 중 어떤 것을 선택해야 할지 모르겠어요!" → 충돌 발생!
충돌이 발생하지 않는 경우
# 다른 파일 수정 → 충돌 없음
main: file1.js 수정
feature: file2.js 수정
# 같은 파일, 다른 라인 수정 → 충돌 없음
main: file.js 1번째 줄 수정
feature: file.js 10번째 줄 수정
# 같은 파일, 같은 라인 수정 → 충돌 발생!
main: file.js 5번째 줄 수정
feature: file.js 5번째 줄 수정
- 충돌 발생시키기 (실습)
충돌 상황을 직접 만들어보겠습니다.
# 1. 프로젝트 초기화
mkdir conflict-practice
cd conflict-practice
git init
# 2. 초기 파일 생성
cat << 'EOF' > greeting.js
function greet() {
console.log("Hello");
}
EOF
git add .
git commit -m "init: 인사 함수 추가"
# 3. feature 브랜치 생성 및 수정
git switch -c feature/update-greeting
cat << 'EOF' > greeting.js
function greet() {
console.log("Hello Git");
}
EOF
git add .
git commit -m "feat: 인사말을 Hello Git으로 변경"
# 4. main 브랜치에서 같은 부분 수정
git switch main
cat << 'EOF' > greeting.js
function greet() {
console.log("Hello World");
}
EOF
git add .
git commit -m "feat: 인사말을 Hello World로 변경"
# 5. 병합 시도 → 충돌 발생!
git merge feature/update-greeting
# 출력
Auto-merging greeting.js
CONFLICT (content): Merge conflict in greeting.js
Automatic merge failed; fix conflicts and then commit the result.
- 충돌 파일 구조 이해하기
충돌이 발생한 파일을 열어보면 다음과 같은 구조를 볼 수 있습니다.

function greet() {
<<<<<<< HEAD
console.log("Hello World");
=======
console.log("Hello Git");
>>>>>>> feature/update-greeting
}
충돌 마커 설명
마커 설명
| <<<<<<< HEAD | 현재 브랜치(HEAD)의 내용 시작 |
| ======= | 구분선 |
| >>>>>>> branch-name | 병합하려는 브랜치의 내용 끝 |
<<<<<<< HEAD
현재 브랜치(main)의 코드
=======
병합하려는 브랜치(feature)의 코드
>>>>>>> feature/update-greeting
- 충돌 해결 방법

방법 1: 수동으로 해결
가장 기본적인 방법으로, 직접 파일을 편집합니다.
# 1. 충돌 파일 확인
git status
# 출력
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: greeting.js
# 2. 파일 열어서 수정
code greeting.js # 또는 vim, nano 등
수정 전:
function greet() {
<<<<<<< HEAD
console.log("Hello World");
=======
console.log("Hello Git");
>>>>>>> feature/update-greeting
}
수정 후 (원하는 내용으로 선택/수정):
function greet() {
console.log("Hello World and Git");
}
# 3. 수정 완료 후 스테이징
git add greeting.js
# 4. 커밋
git commit -m "merge: feature/update-greeting 병합 및 충돌 해결"
방법 2: 특정 브랜치 내용 선택
한쪽 브랜치의 내용을 전체 선택할 수 있습니다.
# 현재 브랜치(main)의 내용 선택
git checkout --ours greeting.js
# 병합 브랜치(feature)의 내용 선택
git checkout --theirs greeting.js
# 스테이징 및 커밋
git add greeting.js
git commit -m "merge: feature 브랜치 내용으로 충돌 해결"
방법 3: VS Code로 해결
VS Code는 충돌 해결을 위한 편리한 UI를 제공합니다.
# VS Code로 파일 열기
code greeting.js
VS Code에서 충돌 부분에 다음 버튼이 표시됩니다:
- Accept Current Change: 현재 브랜치(HEAD) 선택
- Accept Incoming Change: 병합 브랜치 선택
- Accept Both Changes: 둘 다 포함
- Compare Changes: 변경 사항 비교
방법 4: Git Mergetool 사용
Git에 설정된 병합 도구를 사용합니다.
# mergetool 실행
git mergetool
# 도구 설정 (VS Code)
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
# 도구 설정 (IntelliJ)
git config --global merge.tool intellij
git config --global mergetool.intellij.cmd 'idea merge $LOCAL $REMOTE $BASE $MERGED'
- 충돌 해결 실습
전체 과정을 다시 실습해보겠습니다.
# 1. 충돌 상태 확인
git status
# 2. 충돌 파일 목록만 확인
git diff --name-only --diff-filter=U
# 3. 충돌 내용 확인
git diff
# 4. 파일 수정 (에디터로)
# greeting.js 파일에서 충돌 마커 제거하고 원하는 내용 작성
# 5. 수정 완료 확인
cat greeting.js
# function greet() {
# console.log("Hello World and Git");
# }
# 6. 스테이징
git add greeting.js
# 7. 상태 확인
git status
# All conflicts fixed but you are still merging.
# 8. 커밋
git commit -m "merge: greeting 충돌 해결"
# 9. 로그 확인
git log --oneline --graph
# * a1b2c3d (HEAD -> main) merge: greeting 충돌 해결
# |\
# | * b2c3d4e (feature/update-greeting) feat: 인사말을 Hello Git으로 변경
# * | c3d4e5f feat: 인사말을 Hello World로 변경
# |/
# * d4e5f6g init: 인사 함수 추가
- 병합 취소하기
충돌 해결이 복잡하거나 잘못되었을 때 병합을 취소할 수 있습니다.
병합 중 취소 (커밋 전)
# 병합 취소하고 이전 상태로
git merge --abort
병합 후 취소 (커밋 후)
# 방법 1: reset으로 완전히 되돌리기
git reset --hard HEAD~1
# 방법 2: revert로 되돌리기 (이력 유지)
git revert -m 1 HEAD
- Rebase 중 충돌 해결
Rebase 중 충돌이 발생하면 각 커밋마다 해결해야 합니다.
# 1. Rebase 시작
git switch feature/login
git rebase main
# 충돌 발생!
# CONFLICT (content): Merge conflict in file.js
# 2. 충돌 해결
# 파일 수정...
git add file.js
# 3. Rebase 계속
git rebase --continue
# 4. 다음 커밋에서 또 충돌 발생 시 2-3 반복
# Rebase 전체 취소
git rebase --abort
# 현재 커밋 건너뛰기
git rebase --skip
Merge vs Rebase 충돌 해결 비교
항목 Merge Rebase
| 충돌 해결 횟수 | 1회 | 커밋 개수만큼 |
| 취소 명령어 | git merge --abort | git rebase --abort |
| 계속 명령어 | git commit | git rebase --continue |
- 충돌 예방하기
충돌을 완전히 피할 수는 없지만, 줄일 수 있습니다.
1. 자주 동기화하기
# main 브랜치 변경사항을 자주 가져오기
git switch feature/my-feature
git merge main # 또는 git rebase main
2. 작은 단위로 작업하기
# ❌ 나쁜 예: 일주일 동안 큰 기능 개발 후 병합
# ✅ 좋은 예: 작은 단위로 자주 병합
3. 팀과 소통하기
# 같은 파일을 수정할 예정이라면 미리 공유
# 코드 리뷰를 통해 충돌 가능성 파악
4. 파일 분리하기
# ❌ 하나의 큰 파일에 모든 기능
# ✅ 기능별로 파일 분리
- 복잡한 충돌 해결 팁
충돌 파일이 많을 때
# 충돌 파일 목록 확인
git diff --name-only --diff-filter=U
# 하나씩 해결
git add file1.js
git add file2.js
# ...
# 모든 충돌 해결 후 커밋
git commit
특정 파일을 한쪽으로 통일
# 모든 충돌을 현재 브랜치로
git checkout --ours .
# 모든 충돌을 병합 브랜치로
git checkout --theirs .
# 주의: 신중하게 사용!
충돌 히스토리 확인
# 충돌 원인이 된 커밋 확인
git log --merge
# 파일별 수정 이력 확인
git log -p -- greeting.js
- 충돌 해결 명령어 정리
# 충돌 상태 확인
git status
git diff --name-only --diff-filter=U
# 충돌 내용 확인
git diff
# 충돌 해결 후
git add 파일명
git commit
# 특정 브랜치 선택
git checkout --ours 파일명 # 현재 브랜치
git checkout --theirs 파일명 # 병합 브랜치
# 병합 취소
git merge --abort # Merge 중
git rebase --abort # Rebase 중
# Rebase 계속
git rebase --continue
git rebase --skip
# 도구 사용
git mergetool
마무리
이번 시간에는 Git 충돌(Conflict) 해결 방법에 대해 알아봤습니다. 충돌은 협업에서 자연스럽게 발생하는 현상이니 두려워하지 마세요. 충돌 마커를 이해하고, 원하는 내용으로 수정한 뒤 커밋하면 됩니다. 자주 동기화하고 작은 단위로 작업하면 충돌을 줄일 수 있습니다.
다음 시간에는 원격 저장소(Remote) 연결 방법에 대해 알아보겠습니다.
참고 자료
'컴퓨터공학 > Git' 카테고리의 다른 글
| [Git] - Clone vs Fork 차이점 (0) | 2025.12.24 |
|---|---|
| [Git] - push, pull, fetch 명령어 이해 (0) | 2025.12.23 |
| [Git] - Rebase vs Merge 차이점 (0) | 2025.12.21 |
| [Git] - 브랜치 병합(Merge) 방법 (0) | 2025.12.20 |
| [Git] - 브랜치(Branch) 개념과 생성/삭제 (0) | 2025.12.19 |