개인 저장소에서 최신 "dev" 브랜치를 가져와 머지하려 할 때, 다음과 같은 오류 메시지가 나타났습니다.
PS V:\work\hwh> git pull origin dev
From http://192.168.123.137:8080/projects/hwh
* branch dev -> FETCH_HEAD
cc0ed73..e484d7c dev -> origin/dev
error: fetching ref refs/remotes/origin/dev failed: incorrect old value provided
이 오류는 로컬 저장소에 기록된 원격 추적 브랜치(remote-tracking branch) 의 참조 값(ref)이, 실제 원격 서버의 상태와 일치하지 않을 때 발생합니다. Git의 입장에서는 "내가 알기로는 이 브랜치의 이전 상태가 A여야 하는데, 왜 갑자기 B가 되어 있어?"라며 업데이트 자체를 거부하는 상황입니다.
단계별 해결 방법
① 로컬 원격 참조 파일 삭제 후 재수신
가장 기본적으로 수행해야하는 방법입니다. 문제가 발생한 원격 브랜치의 참조 파일을 삭제하고 새로 받아오면 됩니다. 로컬 작업 내역은 전혀 영향을 받지 않으니 안심하고 진행하셔도 됩니다.
원격 참조 디렉토리를 삭제합니다.
rm -rf .git/refs/remotes/origin/
삭제 후 원격 정보를 새로 가져옵니다.
git fetch origin
② 가비지 컬렉션 및 참조 정리
Git 내부 데이터베이스를 최적화하고 불필요하거나 잘못된 참조를 정리하는 방법입니다.
가비지 컬렉션을 실행합니다.
git gc --prune=now
원격에는 없지만 로컬에 남아 있는 브랜치 정보를 제거합니다.
git remote prune origin
(저의 경우, 이더넷 연결 불안정의 문제로 저장소 파일이 많이 깨졌는지 이단계까지 수행을 해야 저장소가 정상화되었습니다.)
③ 강제 업데이트 (Force Fetch)
참조 값이 꼬여 있을 때 강제로 덮어쓰도록 명령하는 방법입니다.
git fetch --all --force
왜 이런 오류가 발생하나요?
일반적으로 다음과 같은 상황에서 발생합니다.
- "git fetch" 도중 네트워크가 끊겨서 ".git" 내부 파일이 불완전하게 기록된 경우
- 원격 저장소에서 "force push"가 발생하여 히스토리가 재작성되었는데, 로컬의 "packed-refs" 파일이 이를 반영하지 못한 경우
- 파일 시스템의 권한 문제나 기타 오류로 참조 파일이 잠겨 있는 경우
임베디드 리눅스를 이용하고 있는 원격 장비를 sshfs 도구를 이용하여 "V" 드라이브로 연결하여 원격 작업을 하던 중, 이더넷 연결이 가끔 끊어지는 등의 네트워크 불안정 문제로 인하여 발생하였었습니다.
맺는말
Git을 사용하다 보면 이처럼 내부 참조 파일의 불일치로 인한 오류를 종종 마주하게 됩니다. 처음 접하면 다소 낯선 메시지처럼 느껴지지만, 원인을 이해하고 나면 대부분의 경우 간단한 명령 몇 줄로 해결할 수 있습니다.
이번 글에서 소개해 드린 방법을 순서대로 시도해 보시되, 원격 참조 파일을 삭제하고 다시 fetch하는 첫 번째 방법부터 적용해 보시기를 권장드립니다. 로컬 작업 내역에는 전혀 영향을 주지 않으면서도 대부분의 상황을 해결해 주는 가장 안전하고 확실한 방법이기 때문입니다.
무엇보다 중요한 것은, .git 디렉토리 내부의 파일을 직접 수정해야 하는 상황이라면 반드시 백업을 먼저 진행하시는 습관을 들이시는 것입니다. 평소에 발생하기 어려운 상황이지만, 한 번 손상되면 복구가 까다로울 수 있으니 주의하시기 바랍니다.
'프로그래밍' 카테고리의 다른 글
| [git] Gitea vs GitLab: 저사양 가상 서버에서의 최적의 선택은? (0) | 2026.02.09 |
|---|---|
| [VS Code] 확장 설치 시 발생하는 "EAI_AGAIN" 오류 문제 (0) | 2025.08.04 |
| 와이어샤크를 이용하여 V2GTP 메시지 캡쳐 및 분석하기 (0) | 2025.07.31 |
| MIT 라이선스 활용법 (0) | 2024.09.12 |
| 원격 서버 개발환경에서 Git 저장소 설정하기 (0) | 2024.08.29 |