2025. 11. 14. 23:27ㆍGit
서로 다른 Git 저장소 병합하기: 완전 가이드
들어가며
로컬에서 작업하던 프로젝트와 GitHub에 이미 올라가 있는 저장소를 하나로 합쳐야 하는 상황은 자주 발생한다. 예를 들어:
- 로컬에서 새로 시작한 프로젝트를 기존 GitHub 저장소에 추가하고 싶을 때
- 다른 컴퓨터에서 작업한 내용을 기존 저장소와 합치고 싶을 때
- 여러 저장소를 하나로 통합하고 싶을 때
이 글에서는 서로 다른 히스토리를 가진 두 Git 저장소를 안전하게 병합하는 방법을 단계별로 설명한다.
문제 상황
일반적으로 다음과 같은 상황에서 이 작업이 필요하다:
- 로컬에 Git 저장소가 없는 프로젝트 폴더가 있고
- GitHub에 이미 다른 프로젝트들이 있는 저장소가 있을 때
- 두 저장소를 하나로 통합하고 싶을 때
이 경우 단순히 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
병합이 성공하는 경우와 실패하는 경우
✅ 성공하는 경우
파일 경로가 다른 경우
- 로컬:
projectA/,projectB/ - 원격:
projectC/,projectD/ - → 충돌 없이 자동 병합
- 로컬:
같은 경로지만 파일이 다른 경우
- 로컬:
src/app.js(내용 A) - 원격:
src/app.js(내용 B, 완전히 다른 파일) - → 충돌 발생, 수동 해결 필요
- 로컬:
대소문자 차이
- 로컬:
MyProject/ - 원격:
myproject/ - → Git은 대소문자를 구분하므로 다른 경로로 인식 (Windows는 구분 안 함)
- 로컬:
❌ 충돌이 발생하는 경우
같은 경로에 같은 파일이 있고 내용이 다를 때:
로컬: src/main.js (버전 A)
원격: src/main.js (버전 B)이 경우 Git은 자동으로 병합할 수 없어 충돌을 표시한다.
충돌 해결 방법
충돌이 발생했다면 다음 단계를 따르자:
1. 충돌 파일 확인
git status
충돌이 발생한 파일은 both modified로 표시된다.
2. 충돌 파일 열기
충돌 파일을 열면 다음과 같은 마커를 볼 수 있다:
<<<<<<< HEAD
로컬 버전의 코드
=======
원격 버전의 코드
>>>>>>> branch-name3. 충돌 해결
원하는 코드를 선택하거나 두 버전을 합쳐서 수정한다:
최종적으로 원하는 코드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 저장소를 병합하는 과정:
- ✅ 로컬 폴더를 Git 저장소로 초기화
- ✅ 원격 저장소 연결
- ✅ 로컬 파일 먼저 커밋 (중요!)
- ✅
--allow-unrelated-histories옵션으로 병합 - ✅ GitHub에 푸시
핵심 포인트:
--allow-unrelated-histories옵션은 필수- 병합 전에 반드시 로컬 파일을 먼저 커밋
- 충돌이 발생하면 수동으로 해결
- 백업은 항상 필수
이 가이드를 따라하면 안전하게 두 저장소를 하나로 합칠 수 있다!
'Git' 카테고리의 다른 글
| git merge 하는 방법 정리 (0) | 2025.09.12 |
|---|---|
| git 커밋시 특정 파일을 제외하고 싶을 때 (0) | 2025.09.08 |
| 깃 체리픽 정말 쉽게 정리!!! (3) | 2025.08.06 |
| 서브모듈이란? (0) | 2025.06.30 |
| [Git] 깃 저장소에서 여러 디렉토리 관리하려고 하고 하는데 어떤 디렉토리에 -> 표시가 생기고 해당 디렉토리가 들어가지 않는 문제 (0) | 2025.01.11 |