아요 개발 일기

[GitHub] fatal: 관계 없는 커밋 내역의 병합을 거부합니다 본문

GitHub

[GitHub] fatal: 관계 없는 커밋 내역의 병합을 거부합니다

김망복 2023. 1. 27. 18:23
반응형

안녕하세요! 오늘은 git error에 대해 살펴보겠습니다!

 

git push를 하는 과정에서 빈 파일인데 자꾸 pull하라고 떴습니다ㅜㅜ...

 

error 메세지를 해석해보면 아래와 같습니다.

rejected : push가 거부되었습니다.

master -> master : 로컬 저장소의 master 브랜치의 변경 사항을 원격 저장소의 master 브랜치에 반영하려 했는데,

non-fast-forward : 원격 저장소의 master 브랜치가 로컬 저장소의 버전보다 이전 버전이 아닙니다.

 

그래서 pull을 해주었는데, 관계가 없는 커밋 내역의 병합을 거부한다는 오류가 계속 떴습니다..

알고보니 원격 저장소에서 readme.md를 추가하는 커밋이 로컬 저장소의 커밋 로그에는 없기 때문이었습니다!!

 


해결 방법

1. readme.md가 없는 원격 저장소를 만든다.

2. fetch나 pull 명령어로 원격 저장소의 마지막 commit을 로컬 저장소의 commit로그의 맨 앞으로 받아온다.

 

두번째 방법에 대해 자세히 알아보면, pull 명령어는 fetch + merge 작업을 한번에 처리하는 명령어입니다.

 

현 상황 = fetch O , merge X

 

git은 그 지점부터 병합을 시도하기 때문에 기본적으로 merge는 원격 저장소와 로컬 저장소가 공통으로 가지고 있는 commit지점이 존재해야 합니다. 지금은 애초에 공통되는 commit이 없기때문에 pull 명령어를 사용할 수 없었습니다.

 


해결하기 앞서 상황을 이해하기 위해 pull과 fetch의 개념을 살펴봅시다.

 

fetch

원격 저장소에 있는 내용을 가져오지만 자동으로 내 로컬 저장소에 merge하지 않습니다.

원격 저장소의 내용을 확인만 하고 로컬에 merge하고 싶지 않을 때는 fetch를 사용합니다.

 

HEAD에는 가장 마지막에 행해진 commit정보가 담깁니다.

마찬가지로 FETCH_HEAD는 원격 저장소의 가장 최신 commit 이력이 담기게 됩니다.

FETCH_HEAD는 이름 없는 브랜치로 로컬에 가져오게 됩니다.

이 브랜치는 FETCH_HEAD로 checkout도 가능합니다.

 

pull 

원격 저장소에 있는 내용을 가져올 뿐만 아니라, 자동으로 로컬 저장소에 merge합니다.

즉, git pull 명령어는 git fetch + merge FETCH_HEAD와 비슷합니다.


 

복잡하고 긴 설명 끝에 결론은 어쨌든 연결되는 공통된 커밋 포인트가 없다는 것이다.

 

 

이 상황을 해결하기 위한 방법에도 아래와 같이 2가지 방법이 존재합니다.

  1. git clone 명령어를 통해 원격 저장소를 복제해온다.
  2. pull 명령어에 옵션을 추가해 강제로 pull 한다.
git pull origin (branchname) --allow-unrelated-histories

 

 

README.md를 추가한다고 선택했다가.. 

너무 돌아왔네요.....

Git 척척 박사가 될때까지!! 화이팅! : D

 

반응형