깃허브 non-fast-forward 에러 해결하기

rain98·2021년 5월 22일
7

에러 해결

목록 보기
2/2

문제 상황

  • github에서 저장소 생성 후 저장소 주소를 remote에 입력(git remote add origin https://github…..)
  • 로컬에서도 정상적으로 초기화(git init)
  • git pull 또는 git merge 명령이 정상적으로 동작하지 않음
  • git push origin master시 [rejected] master -> master (non-fast-forward)에러 발생
To github.com:
! [rejected]        master -> master (non-fast-forward)
error: 레퍼런스를 'git@github.com:'에 푸시하는데 실패했습니다
힌트: 현재 브랜치의 끝이 리모트 브랜치보다 뒤에 있으므로 업데이트가
힌트: 거부되었습니다. 푸시하기 전에 ('git pull ...' 등 명령으로) 리모트
힌트: 변경 사항을 포함하십시오.
힌트: 자세한 정보는 'git push --help'의 "Note about fast-forwards' 부분을
힌트: 참고하십시오.

원인

깃헙에 생성된 원격 저장소와 로컬에 생성된 저장소 간 공통분모가 없는 상태에서 병합하려는 시도로 인해 발생.
기본적으로 관련 없는 두 저장소를 병합하는 것은 안되도록 설정되어 있다.

git push를 하고 깃허브 repository에 거슬리는 커밋내용을 삭제하려고 했는데 커밋내용이아니라 파일을 삭제 해버렸다. 깃허브 repository에는 파일이 삭제됐지만 기존에 남아있는(Pull Request)파일에는 해당 파일이 남아있어서 충돌이 되는게 원인이 된거같다.

해결방법

첫번째 방법

git pull 시에 –allow-unrelated-histories 옵션 추가하여 관련 없었던 두 저장소를 병합하도록 허용

git pull origin master --allow-unrelated-histories

git에서는 서로 관련 기록이 없는 이질적인 두 프로젝트를 병합할 때 기본적으로 거부하는데, 이것을 허용해 주는 것이다.

하지만 단방향(Pull Request)이기 때문에 나는 브랜치에 pull할 권한이 없기 때문에 실패했다.

두번째 방법

Git Repository에서 과거 Commit내역 삭제하기

어차피 과거 커밋했던 것들을 다 날려버려도 상관 없다면, 내 레파지토리에 들어가서 원인이있는 브랜치로 올렸던 과거 커밋 내역을 삭제하는 것이 가장 맘편한 방법일 것이다.
git reset HEAD^ 를 통해
최근 마지막 커밋 내역 한 개를 삭제할 수 있다. HEAD 끝에 "~n"를 붙이면 최근 n개의 커밋 내역을 삭제한다.

하지만 이방법도 정확한 이유는 모르겠지만 잘되지는 않았다.

세번째 방법

Git push origin feature/OOO -- force

Push origin 뒤에 -- force 를 붙여주면, 과거 커밋 내역과 상관없이 지금 현재 커밋내용으로 덮어씌워 버리는 명령어이다.

두번째 방법과 병행해서 문제가 있는 커밋내역을 삭제(git reset HEAD^)하고
Git push origin feature/OOO -- force을 넣어줘서 정상적으로 push가 되었다.

profile
헷갈리거나 기억에 남기고 싶은것을 기록합니다.

2개의 댓글

comment-user-thumbnail
2022년 6월 24일

감사합니다. 덕분에 오류 무사히 수정했습니다!

답글 달기
comment-user-thumbnail
2023년 4월 21일

찾다 찾다 이 글까지 왔네요ㅠㅠ덕분에 수정했어요!감사합니다!

답글 달기