서로 다른 Git 저장소 병합하기: 완전 가이드

2025. 11. 14. 23:27Git

728x90

서로 다른 Git 저장소 병합하기: 완전 가이드

들어가며

로컬에서 작업하던 프로젝트와 GitHub에 이미 올라가 있는 저장소를 하나로 합쳐야 하는 상황은 자주 발생한다. 예를 들어:

  • 로컬에서 새로 시작한 프로젝트를 기존 GitHub 저장소에 추가하고 싶을 때
  • 다른 컴퓨터에서 작업한 내용을 기존 저장소와 합치고 싶을 때
  • 여러 저장소를 하나로 통합하고 싶을 때

이 글에서는 서로 다른 히스토리를 가진 두 Git 저장소를 안전하게 병합하는 방법을 단계별로 설명한다.

문제 상황

일반적으로 다음과 같은 상황에서 이 작업이 필요하다:

  1. 로컬에 Git 저장소가 없는 프로젝트 폴더가 있고
  2. GitHub에 이미 다른 프로젝트들이 있는 저장소가 있을 때
  3. 두 저장소를 하나로 통합하고 싶을 때

이 경우 단순히 git pull을 하면 "unrelated histories" 에러가 발생한다. 왜냐하면 두 저장소가 완전히 다른 히스토리를 가지고 있기 때문이다.

해결 방법: 단계별 가이드

1단계: 로컬 폴더를 Git 저장소로 초기화

먼저 로컬 프로젝트 폴더를 Git 저장소로 만들어야 한다.

# 프로젝트 폴더로 이동
cd /path/to/your/local/project

# Git 저장소 초기화
git init

이 명령어는 .git 폴더를 생성하여 해당 폴더를 Git 저장소로 만든다.

2단계: 원격 저장소 연결

GitHub 저장소를 원격 저장소로 추가한다.

git remote add origin https://github.com/username/repository-name.git

또는 SSH를 사용하는 경우:

git remote add origin git@github.com:username/repository-name.git

확인 방법:

git remote -v

3단계: 로컬 파일 커밋 (중요!)

이 단계가 매우 중요하다. 병합하기 전에 반드시 로컬 파일들을 먼저 커밋해야 한다. 이렇게 하면:

  • 로컬 파일들이 안전하게 보존된다
  • 나중에 문제가 생겨도 되돌릴 수 있다
  • 병합 과정에서 파일이 사라지지 않는다
# 모든 파일을 스테이징 영역에 추가
git add .

# 커밋 생성
git commit -m "Add local project files"

팁: 커밋 메시지는 나중에 무엇을 추가했는지 알 수 있도록 명확하게 작성하자.

4단계: 원격 저장소와 병합

이제 핵심 단계다. 원격 저장소의 내용을 가져와서 병합한다.

git pull origin main --allow-unrelated-histories

핵심 옵션 설명:

  • --allow-unrelated-histories: 이 옵션이 없으면 Git은 "fatal: refusing to merge unrelated histories" 에러를 발생시킨다. 이 옵션은 서로 다른 히스토리를 가진 저장소를 병합할 수 있게 해준다.

추가 옵션:

  • --no-edit: 병합 커밋 메시지를 자동으로 생성하고 에디터를 열지 않는다. 자동화 스크립트에서 유용하다.
# 에디터 없이 자동으로 병합
git pull origin main --allow-unrelated-histories --no-edit

5단계: 브랜치 이름 확인 및 푸시

병합이 완료되면 GitHub에 푸시한다.

# 브랜치 이름이 main이 아닌 경우 변경 (선택사항)
git branch -M main

# GitHub에 푸시
git push origin main

만약 브랜치 이름이 master라면:

git push origin master

병합이 성공하는 경우와 실패하는 경우

✅ 성공하는 경우

  1. 파일 경로가 다른 경우

    • 로컬: projectA/, projectB/
    • 원격: projectC/, projectD/
    • → 충돌 없이 자동 병합
  2. 같은 경로지만 파일이 다른 경우

    • 로컬: src/app.js (내용 A)
    • 원격: src/app.js (내용 B, 완전히 다른 파일)
    • → 충돌 발생, 수동 해결 필요
  3. 대소문자 차이

    • 로컬: MyProject/
    • 원격: myproject/
    • → Git은 대소문자를 구분하므로 다른 경로로 인식 (Windows는 구분 안 함)

❌ 충돌이 발생하는 경우

같은 경로에 같은 파일이 있고 내용이 다를 때:

로컬: src/main.js (버전 A)
원격: src/main.js (버전 B)

이 경우 Git은 자동으로 병합할 수 없어 충돌을 표시한다.

충돌 해결 방법

충돌이 발생했다면 다음 단계를 따르자:

1. 충돌 파일 확인

git status

충돌이 발생한 파일은 both modified로 표시된다.

2. 충돌 파일 열기

충돌 파일을 열면 다음과 같은 마커를 볼 수 있다:

<<<<<<< HEAD
로컬 버전의 코드
=======
원격 버전의 코드
>>>>>>> branch-name

3. 충돌 해결

원하는 코드를 선택하거나 두 버전을 합쳐서 수정한다:

최종적으로 원하는 코드

4. 해결된 파일 스테이징 및 커밋

# 해결된 파일 추가
git add conflicted-file.js

# 병합 커밋 완료
git commit -m "Merge: resolve conflicts"

실전 예제

예제 1: 완전히 새로운 프로젝트 추가

# 1. 새 프로젝트 폴더로 이동
cd ~/projects/new-project

# 2. Git 초기화
git init

# 3. 원격 저장소 연결
git remote add origin https://github.com/user/existing-repo.git

# 4. 로컬 파일 커밋
git add .
git commit -m "Add new project"

# 5. 병합
git pull origin main --allow-unrelated-histories

# 6. 푸시
git push origin main

예제 2: 여러 프로젝트 통합

# 여러 프로젝트가 있는 폴더
projects/
├── project1/
├── project2/
└── project3/

# 상위 폴더에서
cd projects
git init
git remote add origin https://github.com/user/repo.git
git add .
git commit -m "Add all projects"
git pull origin main --allow-unrelated-histories
git push origin main

주의사항

1. 백업 필수

병합하기 전에 반드시 백업을 만들자:

# 전체 폴더 복사
cp -r my-project my-project-backup

2. 파일 경로 확인

Windows와 Linux/Mac의 경로 구분자가 다르므로 주의하자:

  • Windows: \
  • Linux/Mac: /

Git은 자동으로 처리하지만, 혼란을 피하기 위해 슬래시(/)를 사용하는 것이 좋다.

3. 대용량 파일 주의

대용량 파일(이미지, 비디오 등)이 많으면:

  • .gitignore에 추가하거나
  • Git LFS를 사용하자

4. .gitignore 확인

불필요한 파일이 올라가지 않도록 .gitignore를 확인하자:

# .gitignore 파일 생성/수정
echo "node_modules/" >> .gitignore
echo "*.log" >> .gitignore
echo ".DS_Store" >> .gitignore

자주 묻는 질문 (FAQ)

Q1: --allow-unrelated-histories 없이 할 수 없나요?

A: 안 된다. 서로 다른 히스토리를 가진 저장소는 이 옵션 없이는 병합할 수 없다.

Q2: 병합 후 원격 저장소의 파일이 사라지나요?

A: 아니다. 두 저장소의 모든 파일이 합쳐진다. 단, 같은 경로에 같은 이름의 파일이 있으면 충돌이 발생한다.

Q3: 병합을 취소할 수 있나요?

A: 가능하다. 병합 커밋을 되돌릴 수 있다:

git reset --hard HEAD~1

하지만 백업이 있다면 더 안전하다.

Q4: 여러 번 병합할 수 있나요?

A: 가능하다. 하지만 같은 저장소를 여러 번 병합하면 중복 커밋이 생길 수 있으니 주의하자.

요약

서로 다른 Git 저장소를 병합하는 과정:

  1. ✅ 로컬 폴더를 Git 저장소로 초기화
  2. ✅ 원격 저장소 연결
  3. 로컬 파일 먼저 커밋 (중요!)
  4. --allow-unrelated-histories 옵션으로 병합
  5. ✅ GitHub에 푸시

핵심 포인트:

  • --allow-unrelated-histories 옵션은 필수
  • 병합 전에 반드시 로컬 파일을 먼저 커밋
  • 충돌이 발생하면 수동으로 해결
  • 백업은 항상 필수

이 가이드를 따라하면 안전하게 두 저장소를 하나로 합칠 수 있다!

728x90