포크한 프로젝트에 원본 저장소 최신 업데이트 안전하게 반영하기

포크한 프로젝트에 원본 저장소 최신 업데이트 안전하게 반영하기

오픈소스 정적 사이트 생성기(SSG)나 템플릿을 포크(Fork)해 나만의 웹사이트를 만드는 경우가 많다. config.yml을 입맛에 맞게 수정하고, 디자인도 손보고, 꽤 공을 들였는데 — 어느 날 원본 프로젝트에 정말 탐나는 새 기능이 추가되었다면?

단순히 덮어쓰면 내 커스텀 설정이 모두 날아가고, 그대로 두자니 새 기능을 누릴 수 없다. 이럴 때 Git의 upstream 설정을 활용하면, 내 수정 사항은 지키면서 원본의 새 기능만 깔끔하게 가져올 수 있다.


1단계. 현재 저장소 상태 확인

작업을 시작하기 전, 로컬 저장소에 연결된 원격 저장소(Remote) 상태를 먼저 확인한다.

git remote -v

정상적인 출력은 아래와 같다.

origin  [email protected]:my-name/my-website.git (fetch)
origin  [email protected]:my-name/my-website.git (push)

현재는 내가 운영 중인 저장소(origin)만 등록된 상태다.


2단계. 원본 저장소(Upstream) 연결

원본 코드가 있는 저장소를 upstream이라는 이름으로 등록한다. 이렇게 해야 원본의 최신 변경 사항을 추적할 수 있다.

# 원본 프로젝트를 upstream으로 추가
git remote add upstream https://github.com/open-source/ssg-template.git

# 제대로 추가되었는지 확인
git remote -v

목록에 originupstream이 모두 표시되면 성공이다.


3단계. 원본 최신 커밋 가져오기 (Fetch)

upstream이 등록됐다면, 원본 저장소의 최신 커밋과 브랜치 정보를 내 컴퓨터로 내려받는다. 이 과정은 실제 코드를 병합하는 것이 아니라 정보만 동기화하는 안전한 단계다.

git fetch upstream

명령 실행 후 upstream/main 브랜치의 최신 내역이 로컬에 다운로드된다.


4단계. 내 브랜치에 병합 (Merge)

이제 가져온 최신 코드를 현재 작업 브랜치(보통 main)에 합친다.

git merge upstream/main

원본이 수정한 파일과 내가 수정한 파일이 겹치지 않는다면 자동으로 병합된다. 그러나 양쪽 모두 config.yml을 수정했다면 충돌(Conflict)이 발생한다. 터미널에 아래와 같은 메시지가 출력된다.

CONFLICT (content): Merge conflict in config.yml
Automatic merge failed; fix conflicts and then commit the result.

5단계. 충돌 해결

당황할 필요 없다. Git이 어느 쪽 내용을 채택해야 할지 모르기 때문에 선택을 우리에게 넘긴 것뿐이다. VS Code 같은 에디터로 충돌 파일을 열면 다음과 같은 구조가 보인다.

<<<<<<< HEAD
# 내가 수정한 내용
title: "나만의 멋진 블로그"
author: "개발자 A"
=======
# 원본 저장소의 최신 내용
title: "기본 SSG 템플릿"
new_awesome_feature: true
>>>>>>> upstream/main
  • <<<<<<< HEAD ~ ======= : 현재 내 브랜치의 내용
  • ======= ~ >>>>>>> upstream/main : 원본에서 가져온 내용

목표는 내 설정(title: "나만의 멋진 블로그")은 살리고, 원본의 새 기능(new_awesome_feature: true)도 함께 반영하는 것이다. 불필요한 Git 마커(<<<<<<<, =======, >>>>>>>)를 모두 제거하고 아래처럼 정리한 뒤 저장한다.

title: "나만의 멋진 블로그"
author: "개발자 A"
new_awesome_feature: true

6단계. 커밋 후 배포 (Push)

충돌을 모두 해결했다면, 병합 완료를 커밋하고 내 원격 저장소에 푸시한다.

# 해결한 파일 스테이징
git add config.yml

# 병합 완료 커밋
git commit -m "Merge upstream updates and resolve config conflicts"

# 내 저장소에 반영
git push origin main

정리

단계 명령어 설명
상태 확인 git remote -v 등록된 원격 저장소 목록 확인
upstream 등록 git remote add upstream <URL> 원본 저장소 연결
최신 정보 수신 git fetch upstream 원본 커밋 정보 다운로드 (병합 없음)
병합 git merge upstream/main 내 브랜치에 원본 변경 사항 반영
충돌 해결 에디터에서 직접 편집 마커 제거 후 원하는 내용으로 정리
배포 git addgit commitgit push 최종 반영

upstream 설정은 한 번만 해두면 이후에는 git fetch upstreamgit merge upstream/main 두 단계만으로 원본 업데이트를 안전하게 가져올 수 있다. 내 커스텀 작업물을 지키면서도 오픈소스의 혜택을 꾸준히 누릴 수 있는 실용적인 Git 워크플로다.