최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday

티스토리 뷰

한개의 Repository에서 여러개의 remotes를 포함하고 있을 때, 브랜치를 가져온 뒤 pull 하는 경우 
"git refusing to merge unrelated histories" 이런 에러를 만난다면 다음의 case일 확률이 높다.

 

현재 상황

$ git remote

origin

tutorial2

여기에서 원격의 tutorial2/main 브랜치를 로컬로 가져와서 동기화($ git pull) 하고 싶다.

 

git pull 하면 refusing 에러가 난다. 당연하다.

내가 하고싶었던 것

 

 

에러가 나는 이유?

조금만 생각하면 당연하다. *origin/master에서 분기 처리하여 만든($ git checkout -b main)브랜치는

"origin =/= tutorial2" 로 저장소가 다른 브랜치 이다. 

master의 내용으로 브랜치를 만든 main은 pull 하는 경우 commit 할 HEAD가 맞지 않아 오류가 난다. 

* 이 상황을 해결하려면 main 이 녹색이 아니라 파란색이 되어야 한다

원격 브랜치를 바로 바라 볼 수 있도록 $ git checkout <branch-name> 하면 된다.

기존의 -b 옵션을 제외하고 원격 브랜치를 바로 바라보도록 연결 시켜주도록 한다.

이후 fetch와 pull 명령를 사용하면 된다.

 

$ git checkout <remote-name> <branch-name>

execute: $ git checkout tutorial2 main

$ git checkout <branch-name>

저는 원격 브랜치 문제가 아니라, pull 자체가 에러나는 상황이에요ㅠ

근본적인 해결은 다음의 2가지 이다.

1. git clone <remote-address>
2. git pull <remote-name: origin> <branch-name: main> --allow-unrelated-histories

 

1번은 단일 repository인 경우 시도해 볼 만한 방법이다.

때로는 문제가 되는 부분을 추적해서 고치는것 보다 모듈 통째로 교체하는것도 좋은 방법이다.

 

이는 마치 자동차로 비유하면 수리할 대상의 물질을 하나씩 잡아내서 점검하는 것 보다,

문제가 되는 부품을 모듈(Assembly) 단위로 교체하면 만사 OK인 바로 그런 경우이다.

 

그러나, remotes가 여러개 모두 등록된 상황에서 이런 문제가 터진 경우 clone으로는 해결할 수가 없다.

( .... 곰곰히 생각해보니

origin을 clone하고

remote add로 다른 원격저장소 추가한 뒤,

$ git checkout <branch-name>​로 일일이 pull 하면

동기화는 된다... )

 

이럴 때 git pull <remote-name> <branch-name> --allow-unrelated-histories 명령어로 강제 해결하도록 하면 된다.​

이미 존재하는 프로젝트의 기록을 저장하는 드문 상황에서 사용하면 된다.

서로 관련 기록이 없는 프로젝트를 병합할 index트리와 HEAD가 달라서 거부를 할텐데

이것을 허용해 주는 옵션이다

 

git pull origin main --allow-unrelated-histories​

'■ 개발이력관리 ■ > Git' 카테고리의 다른 글

git merge vs git rebase (2)  (0) 2023.11.10
git merge vs git rebase (1)  (0) 2023.11.10
Git Merge Request, Git Pull Request  (0) 2020.10.15
remote 목록, 수정, 삭제  (0) 2020.06.02
[rejected] master -> master (non-fast-forward)  (0) 2020.06.02
댓글