티스토리 뷰
한개의 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가 맞지 않아 오류가 난다.
원격 브랜치를 바로 바라 볼 수 있도록 $ git checkout <branch-name> 하면 된다.
기존의 -b 옵션을 제외하고 원격 브랜치를 바로 바라보도록 연결 시켜주도록 한다.
이후 fetch와 pull 명령를 사용하면 된다.
$ git checkout <remote-name> <branch-name>
execute: $ git checkout tutorial2 main
저는 원격 브랜치 문제가 아니라, 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 |