main 브랜치에 pushgit pull을 했는데 오류 발생fatal: Not possible to fast-forward, aborting.
또는
pull은 했는데 코드가 꼬이거나
브랜치 상태가 예상과 다르게 변함
즉,
“팀원이 올린 코드를 받아오려 했는데, Git이 거부한 상황”
🔍 원인 정리
이 문제는 대부분 로컬 브랜치와 원격 브랜치의 커밋 히스토리가 갈라졌을 때(diverge) 발생한다.
1️⃣ 로컬 커밋과 원격 커밋이 서로 다른 방향으로 진행됨
로컬 main 브랜치에서 커밋을 한 상태
동시에 원격 origin/main에도 다른 커밋이 추가됨
이 경우 Git은:
“어느 쪽이 기준인지 모르겠다”
→ fast-forward 불가
2️⃣ fast-forward 이란?
히스토리가 갈라지지 않았을 때,
병합 커밋 없이 브랜치가 직선으로 이어지는 상태를 말한다.
팀 프로젝트에서는
각자 브랜치에서 작업한 결과를 main에 병합하기 때문에
fast-forward가 되지 않는 구조가 오히려 자연스럽다.
반대로 개인 프로젝트에서는
히스토리가 갈라질 일이 거의 없으므로
fast-forward가 더 단순하고 안전하다.
A -- B -- C (origin/main)
\
D (local main)
이 구조에서는:
단순히 앞으로 당길 수 없음
반드시 merge 또는 rebase가 필요
3️⃣ pull.rebase 옵션의 영향
환경에 따라 Git 설정이 다음과 같을 수 있다.
git config --global pull.rebase true
이 경우:
git pull = fetch + rebase
rebase란 내 커밋들을 다른 브랜치의 최신 커밋 뒤로 “다시 얹는” 작업이다.
충돌 발생 시 더 복잡해 보일 수 있음
원인을 모르면 “왜 갑자기 안 되지?”라는 느낌을 받게 됨
🛠 해결 방법
✅ 1) 무조건 git fetch부터
git fetch origin
원격 변경사항을 작업 트리에 반영하지 않고
상태만 먼저 확인
git log --oneline --graph --all
→ 브랜치가 어떻게 갈라졌는지 시각적으로 확인 가능
✅ 2) merge로 충돌을 직접 해결
git merge origin/main
충돌 발생 시
파일 열어서 직접 수정
git add
git commit
👉 팀 프로젝트에서는 가장 안전한 방식
✅ 3) 로컬 작업이 필요 없을 경우
git reset --hard origin/main
로컬 변경사항 전부 폐기
원격 상태와 완전히 동일하게 맞춤
⚠️ 주의: 협업 중에는 신중히 사용
✅ 4) 브랜치 전략 재정의
문제의 근본 원인은 브랜치 운영 규칙 부재인 경우가 많다.
main 직접 작업 ❌
기능 단위로 feature 브랜치 사용
PR 기반으로 merge
예:
feature/login
feature/oauth
feature/ban