← 모든 글

git push non-fast-forward 오류 해결 방법

원인: 원격 저장소에 내 브랜치에 없는 커밋(변경 기록)이 있습니다. Git이 이 기록을 덮어쓰지 못하도록 push를 막은 것입니다.

해결: 가져오기(fetch) → 합치기(merge) → 다시 올리기(push) 순서로 진행하세요.

작업을 커밋한 main에서 한 줄씩 실행하세요. 오류가 나면 멈추세요.

git fetch origin
git merge --no-edit origin/main
git push origin main

다른 브랜치라면 main을 해당 이름으로 바꾸세요.

화면은 실제 프로그램에서 캡처했습니다. 이미지를 누르면 새 탭에서 원래 크기로 볼 수 있습니다. 넓은 화면은 이미지 안에서 좌우로 밀어 보세요.

1. 오류 원인과 작업 상태 확인

내가 작업하는 동안 다른 사람이 먼저 push하면 원격에 새 커밋이 생깁니다. 내 브랜치가 그 커밋을 포함하지 않은 채 push하면 non-fast-forward로 거절됩니다. 파일 충돌이 이미 발생했다는 뜻은 아닙니다.

저장소 폴더의 터미널에서 현재 브랜치와 변경 파일을 확인하세요.

git branch --show-current
git status --short --branch

브랜치가 main이 아니라면 이후 main을 그 이름으로 바꾸세요. M, A, ??가 표시되면 필요한 변경을 먼저 커밋하세요.

오류와 현재 브랜치 확인 실제 PowerShell 화면
화면에서 찾을 항목: main -> main (non-fast-forward), 현재 브랜치 main, 상태의 ## 줄

확인할 결과첫 명령의 결과가 main이고, 상태의 ## 줄 아래에 변경 파일이 없으면 진행합니다.

2. 합치기 전 내 커밋 보관하기

내 커밋에 백업 브랜치 이름을 붙여 둡니다. 현재 브랜치는 바뀌지 않습니다.

git branch backup/non-fast-forward
git branch --list

이미 같은 이름이 있으면 기존 백업을 지우지 말고 backup/non-fast-forward-2처럼 새 이름을 쓰세요. 커밋하지 않은 파일은 이 백업에 포함되지 않습니다.

현재 커밋에 백업 이름 붙이기 실제 PowerShell 화면
화면에서 찾을 항목: backup/non-fast-forward와 * main

확인할 결과목록에 backup/non-fast-forward와 * main이 함께 보이면 됩니다.

3. 원격 변경 가져오기

fetch는 원격의 새 커밋을 가져옵니다. 아직 내 파일을 합치지는 않습니다.

git fetch origin
git log --oneline --graph --decorate --all -5

아래 화면처럼 내 main과 원격의 origin/main이 갈라져 있으면 다음 단계에서 합칩니다. fetch가 인증, 주소 오류로 실패하면 여기서 멈추고 그 오류를 먼저 해결하세요.

원격 변경 가져오기 실제 PowerShell 화면
화면에서 찾을 항목: 갈라진 main과 origin/main, 공통 Initial shared commit

확인할 결과Add my note와 Add team note가 각각 보이고, 아래에 공통 시작점 Initial shared commit이 있습니다.

4. 원격 변경 합치기

merge는 내 작업과 원격의 변경 이력을 합칩니다. --no-edit는 기본 병합 메시지를 사용해 편집기가 열리지 않게 합니다.

git merge --no-edit origin/main

이 화면에서는 자동으로 합쳐졌습니다. CONFLICT가 나오면 push를 멈추세요. 작업을 모두 커밋한 상태로 시작했다면 git merge --abort로 병합을 취소하고 충돌 파일의 양쪽 변경을 확인하세요. refusing to merge unrelated histories는 별도 문제이므로 이 절차를 계속 진행하지 마세요.

원격 변경을 내 브랜치에 합치기 실제 PowerShell 화면
화면에서 찾을 항목: Merge made by the 'ort' strategy와 team-note.txt 추가

확인할 결과Merge made by the 'ort' strategy가 나오면 병합 성공입니다. 원격의 team-note.txt가 추가됐습니다.

5. 다시 push하기

병합이 성공한 다음 원격에 올립니다.

git push origin main

다시 non-fast-forward가 나오면 작업 중 원격에 새 커밋이 올라왔을 수 있습니다. fetch부터 다시 확인하세요. --force는 원격 이력을 덮어쓸 수 있어 여기서는 사용하지 않습니다.

다시 push하기 실제 PowerShell 화면
화면에서 찾을 항목: 거절 없는 커밋 범위와 main -> main

확인할 결과[rejected]가 사라지고 커밋 범위와 main -> main이 표시되면 push 성공입니다.

6. 정상 업로드 확인하기

마지막으로 원격과 내 브랜치가 같은 상태인지 확인합니다.

git status --short --branch
git log --oneline --graph --decorate -4

## main...origin/main에 ahead, behind가 없고, 그 아래 변경 파일도 없어야 합니다. 병합 커밋에 HEAD -> main과 origin/main이 함께 보이는지 확인하세요.

정말 같은 상태인지 확인하기 실제 PowerShell 화면
화면에서 찾을 항목: ## main...origin/main, HEAD -> main과 origin/main, 양쪽 커밋

확인할 결과원격과 내 main이 같은 커밋을 가리키며 Add my note, Add team note가 모두 남아 있습니다.

참고한 자료

캡처 환경 확인

캡처는 오류를 재현한 PC 내부 연습 저장소입니다. Windows PowerShell 5.1, git version 2.52.0.windows.1. main 브랜치에서 작업을 커밋한 뒤 자동 병합을 확인했습니다. 충돌 파일을 수동으로 해결한 화면은 포함하지 않습니다.