refusing to merge unrelated histories

이리·2025년 3월 13일
0

Trouble Shooting

목록 보기
4/5

문제 원인

아직 terminal로 깃을 다루는게 익숙하지 않다보니 sourceTree를 같이 사용하곤 했습니다.

이게 문제의 원인이 된거죠..

git으로 main에 ‘init’이라 commit하고 main에서 브랜치를 따오지 않고 다시 sourcetree로 ‘initial commit’이라는 새로운 커밋으로 시작한 것이 원흉이었습니다.(조상 커밋이 다른 2개의 히스토리) ㅠㅠ

  1. 서로 다른 커밋(init, initial commit)에서 시작했기 때문에 history가 다른 2개로 시작되게 됩니다.
  2. merge를 위해서는 공통의 조상이 필요한데 history가 다르기때문에 자동 merge가 불가능합니다

다음은 제가 해결 과정을 순서대로 정리한 결과입니다.


해결 방법

1. --allow-unrelated-histories

현재 2개의 history가 존재하는 것을 알 수 있습니다.

이 두개의 history를 합쳐줘야하기 때문에 --allow-unrelated-histories로 두개의 history를 합쳐줍니다.

git pull origin 브랜치명 --allow-unrelated-histories

  • --allow-unrelated-histories: 이미 존재하는 두 프로젝트의 기록을 저장하는 드문 상황에 사용합니다.

2. Need to specify how to reconcile divergent branches

main으로 checkout한 뒤 origin master를 --allow-unrelated-histories조건으로 pull 받으려 했지만

Need to specify how to reconcile divergent branches라는 오류가 났습니다.

이 오류는 branch를 새로 생성해서 작업하면서 생긴 오류로 새로운 branch가 추가됐다면 pull 전에 어떤 병합 전략을 사용할지 선택해 달라는 말입니다.


간단하게 Pull 전략에 대해 정리해보면
  • git pull은 원격 저장소에서 로컬 저장소로 파일을 가져와 자동으로 병합을 실행합니다.
  • git fetch는 원격저장소의 내용을 가져오지만 로컬 데이터와 병합하지는 않습니다.

즉, pull은 fetch + merge로 pull을 하면서 자동 merge를 시도하지만 fast-forward에 적합하지 않기때문에 오류가 발생했던거죠.

fast-forward란?
fast-forward는 Git에서 합칠 때, 별도의 추가 커밋 없이 커밋 히스토리를 그냥 앞으로 전진시키는 것을 말합니다.
→ 원격에만 새로운 커밋 존재, 로컬엔 X인 경우

master와 main을 합쳐야 했기에 checkout main에서 git pull origin master —rebase를 진행했습니다.

이렇게 연결이 됐고, 이제 local main과 origin main을 합치고 싶어 git pull origin main을 했더니 정방향이 불가능하므로, 중지합니다.라는 오류가 발생했습니다.

3. 정방향이 불가능하므로, 중지합니다.

원인은 공통의 조상이 없는 상태에서 merge를 진행하려 했기 때문입니다.

공통 조상이 없을 경우 자동 merge가 불가능하고 merge 전략을 제시해줘야합니다

git merge master --allow-unrelated-histories 로 merge의 충돌을 잡아줬고, merge 결과를 푸쉬하면서 문제를 해결할 수 있었습니다.


정리

다른 커밋으로 시작하게 될 경우 별도의 history로 시작하게 됩니다. 이것은 다른 조상으로 시작한다는 말이기 때문에 자동 merge가 될 수 없는 환경인거죠!

merge 전략을 세우고 별도 작업(--allow~~)들로 해결할 수는 있지만 꽤나 귀찮은 상황입니다.

작업전 pull을 확실하게! 하는걸 생활화합시다!

0개의 댓글