[github] 원격 저장소에 push가 안될 때(rejected error 발생 시) 또는 pull시에 fatal: refusing to merge unrelated histories 발생 시 해결 방법

김성수·2023년 5월 24일
2

github

목록 보기
2/11

들어가면서

github에서 리포지토리를 생성했을 때 readme 파일을 수정하면
gitbash에서 push가 안되는 문제가 발생하였다.
그 문제를 해결하는 과정을 적어보려 한다.



문제가 발생한 시점

예를 들어, 아래 이미지와 같이 testtest 리포지토리를 만들면서 리드미 파일을 생성하고
수정했다고 가정해보자.

위 리포지토리에 내 로컬 파일을 업로드하고 싶다.

그래서 이런 저런 명령어를 거치고
(아래 링크와 같은 과정을 거쳤다.)

https://velog.io/@ni0307/github-%EB%A1%9C%EC%BB%AC-%ED%8C%8C%EC%9D%BC-github-%EB%A6%AC%ED%8F%AC%EC%A7%80%ED%86%A0%EB%A6%AC%EC%97%90-%EC%98%AC%EB%A6%AC%EA%B8%B0

마지막 push 부분에 도달했는데 아래와 같은 에러가 발생하였다.


위 문제가 발생했을 시점에는 이것 저것 해보았다.

git pull origin main 명령어를 사용하여 리포지토리에 저장된 파일을 내 로컬 파일에 저장하려 했으나,

리드미 파일이 로컬 파일에 저장되지 않는 문제가 발생하였다.


git push -f origin main 명령어로 강제로 리포지토리에 파일을 업로드했는데,

리드미 파일까지 삭제되고 업로드 된걸로 보아서,

기존에 원격저장소에 저장되어 있던 데이터들이 싹다 변경되는 것으로 판단되어

좋은 방법이 아니라고 생각한다.


git pull이 되지 않는 문제가 발생하고 있었다.

fatal: refusing to merge unrelated histories

위와 같은 에러를 google링 해봤다.

그리고 원인을 찾아낼 수 있었다.


리포지토리를 만들 때 리드미 파일을 만들고 수정하게 되면

원격저장소 상에서 commit 이력이 남게 된다.

하지만 로컬 저장소에서는 commit 이력이 없다.

이러한 gap에서 발생하게 되는 문제이다.


git pull --allow-unrelated-histories origin main

위 명령어를 사용한 뒤에

git push origin main 명령어를 입력하면 성공적으로 리포지토리에 업로드 된다.



git pull --allow-unrelated-histories origin main이란?

두개의 서로 다른 git 저장소가 존재할 때 서로 다른 커밋 이력이 남았다고 가정하자.

위에서 설명했듯이. github에서 리포지토리를 생성할 때 리드미 파일을 만들고 수정하게되면

commit 이력이 남게된다. 그러면 원격 저장소에서 commit 이력이 존재한다.


한편, 로컬 저장소에서 a.txt라는 파일을 만들고 수정했다. 그리고 스테이징에 올린 뒤

commit했다. 그러면 로컬 저장소에서도 commit 이력이 존재하게 된다.


이러한 상황에서 로컬 파일을 원격 저장소에 push 할 때, 두 저장소는 merge(병합)하게 된다.

그런데, 두개의 저장소가 서로 다른 commit 이력을 가지고 있으므로

git 측에서 요청을 rejected 해버린다.


그럴 때 사용할 수 있는 명령어가 git pull --allow-unrelated-histories origin main이다.

위 명령어를 사용하면

두 저장소가 commit 이력이 다르더라도 git pull 요청을 수행해줘라라는 요청이 실행된다.


그렇게되면 원격 저장소에 있던 commit 이력이 현재 작업하고 있는 브랜치로 이동하게 된다.

나는 로컬 저장소에서 commit을 하고 있었으니, 로컬 환경으로 branch로 이동하게 되고 pull했으니 리드미 파일이 로컬 환경에 저장될 수 있게 된다.

위 이미지를 보면 README 파일이 정상적으로 로컬 환경에 pull된 것을 확인할 수 있다.



알게된 점

원격 저장소와 로컬 저장소의 병합 과정

원격 저장소에서의 commit과 로컬 저장소의 commit이 상이할 때

사용자가 직접 그 상이함을 어떻게 다뤄줘야 할건지 선택해야 한다는 점이

꽤나 매혹적으로 느껴진다. 분명 이 명령어를 알고 있지 못하면 해결하기 어려운 문제지만,

좋은 개발자분들이 자신이 해결한 방식을 공유해주셔서 원만하게 해결할 수 있게 되었다.


git pull --allow-unrelated-histories origin main

git pull --allow-unrelated-histories origin main 명령어를 알게 되었다.

위 명령어의 기능을 듣다보면 서로 다른 저장소가 충돌한다는 사실이 과거 로마시대에

국가 vs 국가라는 이미지로 받아들이게 된다.

그래서 그런지 더 재밌게 내용을 흡수할 수 있었던 것 같다.

profile
깊이 있는 소프트웨어 개발자가 되고 싶습니다.

1개의 댓글

comment-user-thumbnail
2023년 5월 24일

덕분에 궁금증 해소했습니다!!

답글 달기