배꼽파지 않도록 잘 개발해요

[Git] git push rejected non-fast-forward 오류의 원인과 해결방법 본문

BackEnd/AWS / Docker / Git

[Git] git push rejected non-fast-forward 오류의 원인과 해결방법

꼽파 2024. 8. 23. 17:20

PS C:\Users\airyt\HoneyTouse_BE> git push origin google
To https://github.com/HoneyTouse/HoneyTouse_BE.git
 ! [rejected]        google -> google (non-fast-forward)
error: failed to push some refs to 'https://github.com/HoneyTouse/HoneyTouse_BE.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. If you want to integrate the remote changes,
hint: use 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
PS C:\Users\airyt\HoneyTouse_BE> git fetch origin
PS C:\Users\airyt\HoneyTouse_BE> git pull origin google
From https://github.com/HoneyTouse/HoneyTouse_BE
 * branch            google     -> FETCH_HEAD
Merge made by the 'ort' strategy.
 README.md                         | 14 +++---
 src/middleware/adminMiddleware.js | 56 ----------------------
 src/middleware/index.js           |  2 -
 src/middleware/loginMiddleware.js | 97 +++++++++++++++++++++++++++++++++++++++
 src/router/adminRouter.js         | 39 ++++++++++------
 5 files changed, 130 insertions(+), 78 deletions(-)
 delete mode 100644 src/middleware/adminMiddleware.js

 

현상

  • 'git push origin google' 명령어로 로컬 브랜치 'google'을 원격 저장소의 'google' 저장소로 푸시하려고 시도했으나, 거부되었다. 
  • 에러 메시지를 살펴보면 'non-fast-forward' 오류로 인해 푸시가 거부되었다고 써있다.

원인

  • 로컬 브랜치 'google'의 상태가 원격 브랜치 'google'보다 뒤쳐져 있다. 
  • 원격 브랜치에서 다른 사람이 이미 업데이트를 했고, 이 업데이트가 로컬 브랜치에 반영되지 않은 상태이다. 
  • 이런 상황에서 직접 푸시를 하게되면, 원격 저장소의 코드가 덮어씌워질 수 있으므로 오류가 나게 된다.

문제

  • 원격 저장소의 google 브랜치가 로컬 브랜치의 상태보다 더 최신이다.
  • 로컬에서 작업하는 동안 원격 저장소의 동일한 브랜치에서 다른 작업자가 새로운 커밋을 추가했거나 변경을 적용한 경우, 로컬 브랜치와 원격 브랜치 간에 차이가 발생할 수 있다.
  • Git은 이 차이를 감지하고, 충돌 가능성을 방지하기 위해 푸시를 거부한다.

해결

1. 원격 브랜치의 최신 상태를 로컬로 병합한다.

  • git pull origin google 명령어를 사용하여 원격 브랜치의 변경사항을 로컬 브랜치로 병합한다.
  • 위 사진에서 이 명령을 실행한 후, 자동 병합이 발생했고, 일부 파일에서 변경사항이 적용되었다.
  • 다시 git push origin google 명령어를 실행하여 성공적으로 푸시할 수 있다.
git pull origin google
git push origin google

 

2. 충돌 발생시 수동으로 해결한다.

  • 만약 git pull 시 충돌이 발생한다면, 충돌된 파일을 수동으로 수정한 후 git add . 명령어로 변경 사항을 스테이징한다.
  • 이후 git commit으로 커밋한 후 다시 git push를 시도한다.
git pull
git add .
git commit
git push


3. 강제 푸시 (주의 필요):

  • 만약 원격 브랜치의 변경 사항을 무시하고 현재 로컬 브랜치를 그대로 푸시하고 싶다면, git push origin google --force 명령어를 사용할 수 있다.
  • 그러나 이는 원격 브랜치의 변경 사항을 덮어씌우는 위험한 작업이므로 주의가 필요하다.
  • 아직 이 명령어를 실행해본적이 없다.
 git push origin google --force

Fast-Forward vs Non-Fast-Forward

  • Fast-Forward : 단순히 로컬 브랜치가 원격 브랜치보다 뒤에 있는 경우, 추가적인 병합없이 푸시가 가능하다.
  • Non-Fast-Forward : 로컬과 원격 브랜치가 서로 다른 커밋을 포함하고 있어서 단순한 푸시로는 해결되지 않고 병합 등의 추가 작업이 필요하다.
728x90