## 10. Git 충돌 / fast-forward 오류

SeoJaeYeong·2025년 12월 15일

📝 문제 상황

  • 팀원이 main 브랜치에 push
  • 로컬에서 git 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

0개의 댓글