Featured image of post [Git] 44. 자주 발생하는 Git 에러와 해결법 총정리

[Git] 44. 자주 발생하는 Git 에러와 해결법 총정리

이 45챕터 시리즈에서 다룬 명령들이 실무에서 가장 자주 만드는 에러 메시지를 원인별로 모아, 각 에러가 어느 챕터의 어떤 개념과 연결되는지 정리한 Git 시리즈 마지막 챕터다.

이 시리즈는 00장의 지도(map)에서 시작해 9개 Part를 거쳐 왔다. 마지막 챕터는 새 개념을 소개하는 대신, 실무에서 실제로 가장 자주 마주치는 Git 에러 메시지를 원인별로 모아 이 시리즈의 어느 장과 연결되는지 정리한다 — 급할 때 이 표만 훑어도 어디로 돌아가 자세한 설명을 찾을지 알 수 있도록 하는 것이 목적이다.

개요

에러는 크게 네 갈래로 나뉜다 — 커밋 이전 단계(스테이징·설정), 브랜치·병합 단계, 원격 동기화 단계, 히스토리 되돌리기 단계다. 이 분류 자체가 3-6부의 순서와 대체로 대응한다.

종류/세부

커밋 이전 단계(1-2부 관련)

에러 메시지(요약)원인해결·참고 챕터
Please tell me who you are작성자 이름·이메일 미설정git config --global user.name/email(02장)
nothing to commit, working tree clean스테이징된 변경이 없음(단순 안내이지 에러 아님)04장의 3단계 모델로 상태 확인
fatal: not a git repositoryGit 저장소가 아닌 디렉터리에서 명령 실행git init(03장) 또는 올바른 디렉터리로 이동
LF will be replaced by CRLF (경고)줄바꿈 정규화 동작02장의 core.autocrlf, 40장의 .gitattributes

브랜치·병합 단계(3부 관련)

에러 메시지(요약)원인해결·참고 챕터
error: Your local changes ... would be overwritten by checkout커밋되지 않은 변경과 전환 대상 브랜치가 충돌커밋하거나 git stash(29장)
CONFLICT (content): Merge conflict in <file>두 브랜치가 같은 부분을 다르게 수정충돌 마커 해결(13장)
error: Cannot delete branch '...' checked out at ...현재 체크아웃된 브랜치를 삭제 시도다른 브랜치로 전환 후 삭제(11장, 12장)
fatal: A branch named '...' already exists동일 이름 브랜치 중복 생성 시도git branch -v로 기존 브랜치 확인(11장)

원격 동기화 단계(4부 관련)

에러 메시지(요약)원인해결·참고 챕터
! [rejected] ... (fetch first)원격이 로컬보다 앞서 있음git pull 또는 fetch 후 병합(19장, 20장)
fatal: The current branch has no upstream branchupstream 미설정 상태에서 인자 없이 pushgit push -u origin <branch>(20장)
Permission denied (publickey)SSH 키 미등록 또는 잘못된 키17장의 HTTPS/SSH 프로토콜 확인
remote: Repository not foundURL 오타 또는 접근 권한 없음git remote -v로 URL 확인(17장)

히스토리 되돌리기 단계(5부 관련)

에러 메시지(요약)원인해결·참고 챕터
error: could not apply ... (cherry-pick/rebase 중)재적용 과정에서 충돌 발생마커 해결 후 --continue(15장, 26장, 27장)
실수로 reset --hard한 뒤 변경을 잃음커밋된 데이터만 복구 가능git reflog(28장)
fatal: refusing to merge unrelated histories공통 조상이 없는 두 히스토리를 병합 시도의도한 것인지 확인 후 --allow-unrelated-histories(13장, 14장)
HEAD detached at <hash> (경고성 안내)브랜치가 아닌 커밋을 직접 체크아웃보존하려면 새 브랜치 생성(12장)

주의사항·함정

에러 메시지를 검색 없이 곧바로 강제 옵션(--force, -D 등)으로 우회하지 않는다: 이 시리즈 전체에서 반복해서 강조했듯, 대부분의 거부·경고는 데이터 손실을 막기 위한 안전장치(20장의 push 거부, 11장의 브랜치 삭제 방지 등). 원인을 먼저 이해하지 않고 강제로 넘어가면, 그 안전장치가 막으려던 문제(다른 사람의 작업 덮어쓰기, 병합되지 않은 커밋 유실)가 실제로 일어난다.

같은 에러라도 원인이 다를 수 있다: 예를 들어 rejected (fetch first)는 다른 사람이 먼저 push했을 수도 있고, 자신이 다른 컴퓨터에서 먼저 작업했을 수도 있다. git log --oneline --graph --all(09장)로 실제 상황을 먼저 파악하는 습관이 성급한 대응보다 낫다.

이 표에 없는 에러를 만났다면 공식 문서가 가장 정확하다: Git 각 명령의 공식 문서(git help <command> 또는 이 시리즈 각 장의 Reference)는 버전에 따른 옵션 변화까지 반영하므로, 오래된 블로그 글보다 신뢰할 수 있는 1차 출처다.

마치며

이 시리즈는 00장의 스냅샷 모델에서 시작해, 기초 설정(1부)과 스냅샷 워크플로(2부)로 Git의 일상적인 사용법을 다졌다. 브랜치와 병합(3부)은 여러 작업을 동시에 진행하는 법을, 원격 저장소와 협업(4부)은 그 작업을 다른 사람과 나누는 법을 다뤘다. 히스토리 되돌리기(5부)와 작업 관리 심화(6부)는 실수를 안전하게 복구하고 일상 작업을 더 편하게 만드는 도구들이었고, 내부 구조(7부)는 지금까지 다룬 명령들이 실제로 무엇을 조작해왔는지 설명했다. 확장 기능(8부)과 운영·트러블슈팅(9부)은 여러 저장소를 조합하거나 대규모 환경을 운영할 때 필요한 도구로 마무리됐다.

이 44개 챕터를 순서대로 읽었다면, 이제 남은 것은 검색으로 채우는 세부 옵션들뿐이다 — 3단계 모델, 객체 모델, 참조 모델이라는 세 가지 정신 모델만 확실히 잡고 있으면, 처음 보는 Git 명령이라도 “이것이 어느 영역을 어떻게 바꾸는가"라는 질문으로 대부분 스스로 답을 찾을 수 있다.