“fatal: refusing to merge unrelated histories” 오류란 무엇인가?

이 Git 오류는 공통 커밋 기록을 공유하지 않는 두 브랜치를 git pull 또는 git merge하려고 할 때 발생한다. 이는 사용자가 관련 없는 두 프로젝트를 실수로 병합하는 것을 방지하기 위해 Git 2.9 버전에 도입된 안전 기능이다.

이 상황은 종종 다음과 같은 경우에 발생한다:

  1. 자체 커밋이 있는 새 로컬 저장소를 만든 다음, 자체적인 별도 기록이 있는 원격 저장소에서 pull하려고 할 때.
  2. 프로젝트의 .git 디렉터리가 삭제되고 다시 초기화되어 원래 커밋 기록을 잃어버린 후, 원격 사본과 조정하려고 할 때.

일반적인 원인

근본적인 원인은 병합하려는 두 브랜치가 완전히 분리되고 독립적인 기록을 가지고 있기 때문이다. Git은 병합의 기준으로 사용할 공통 조상 커밋을 찾을 수 없으므로, 중지하고 명시적인 확인을 요청하기 위해 이 오류를 표시한다.

  • 저장소 A 기록: A -> B -> C
  • 저장소 B 기록: X -> Y -> Z

이 두 기록을 병합하는 것은 공유된 시작점이 없기 때문에 간단한 과정이 아니다.

해결 방법

이 두 관련 없는 기록을 병합하려는 것이 확실하다면, --allow-unrelated-histories 플래그를 사용할 수 있다. 이 플래그는 Git에게 상황을 이해하고 병합을 진행하기를 원한다고 명시적으로 알려준다.

1단계: 병합 확인

플래그를 사용하기 전에, 올바른 저장소에 있는지, 그리고 이 기록들을 병합하는 것이 정말로 원하는 작업인지 다시 확인한다. 이 작업은 일반적으로 되돌릴 수 없다.

2단계: 플래그를 사용하여 병합 수행

git pull 또는 git merge를 실행할 때 --allow-unrelated-histories 옵션을 추가한다.

git pull의 경우:

원격 저장소에서 pull하는 경우:

# 예시: origin 원격의 main 브랜치에서 pull
git pull origin main --allow-unrelated-histories

이렇게 하면 원격 브랜치를 가져와 현재 로컬 브랜치에 병합하고, 두 기록을 하나로 묶는 새 병합 커밋을 생성한다.

git merge의 경우:

두 로컬 브랜치를 병합하는 경우:

# 예시: 'unrelated-branch'라는 이름의 브랜치 병합
git merge unrelated-branch --allow-unrelated-histories

3단계: 병합 충돌 해결 (필요 시)

프로젝트가 관련이 없기 때문에, 특히 두 프로젝트 모두에 존재할 수 있는 README.md 또는 .gitignore와 같은 파일에서 병합 충돌이 발생할 가능성이 높다.

  1. 충돌하는 파일을 열고 필요에 따라 차이점을 해결한다.
  2. git add를 사용하여 해결된 파일을 스테이징한다.
  3. 병합을 커밋하여 프로세스를 마무리한다.
# 충돌 해결 후
git add .
git commit -m "관련 없는 기록 병합"

언제 유용한가?

  • 템플릿을 기반으로 새 프로젝트 시작: 로컬 저장소를 초기화한 다음 원격 템플릿을 가져오기로 결정할 수 있다.
  • 저장소 마이그레이션: 한 버전 관리 시스템에서 다른 시스템으로 또는 한 Git 호스트에서 다른 호스트로 이동할 때 기록이 연결되지 않을 수 있다.
  • 손상된 저장소 복구: 로컬 .git 디렉터리가 손실된 경우 원격 백업과 강제로 병합해야 할 수 있다.

--allow-unrelated-histories 플래그를 사용하면 Git의 기본 안전 검사를 무시하고 별도의 커밋 기록을 가진 두 프로젝트를 성공적으로 결합할 수 있다.

Leave a comment