오픈소스 프로젝트에 기여하거나 다른 개발자의 유용한 레포지토리를 내 계정으로 Fork(포크)해 와서 신나게 나만의 커스텀 작업을 시작했던 경험, 다들 한 번쯤 있으실 거예요. 그런데 며칠 지나 원본 저장소를 가보면 수많은 버그 픽스와 새로운 기능들이 줄줄이 머지되어 업데이트되어 있죠. 😊
이때 내 Fork 저장소는 과거 시점에 그대로 멈춰있기 때문에, 최신 코드를 제때 반영하지 않으면 나중에 Pull Request(PR)를 날릴 때 무시무시한 머지 충돌을 마주하게 됩니다. 저 역시 초보 시절 “어라, 원본 변경사항을 도대체 어떻게 내 레포로 가져오지?” 하고 한참을 헤맸던 기억이 생생해요. 오늘은 클릭 한 번으로 끝나는 웹 방식부터 실무에서 반드시 알아야 하는 터미널(CLI) 명령어 동기화 방법까지 아주 쉽게 설명해 드릴게요!
1. 왜 동기화(Sync)가 필요할까요? 기본 개념 잡기 🤔
동기화 방법을 살펴보기 전에 원리를 살짝 이해해 두면 앞으로 실수를 확 줄일 수 있어요. 깃(Git) 세계에서는 저장소를 바라보는 두 가지 중요한 원격 이름이 등장합니다.
- Origin: 내가 Fork 떠온 내 소유의 깃허브 원격 저장소를 의미합니다.
- Upstream: 내가 최초로 포크해 온 원작자의 원본 프로젝트 저장소를 뜻합니다.
Fork는 복사해 오는 그 순간의 스냅샷이기 때문에, 원작자가 원본에 커밋을 아무리 새로 올려도 내 저장소로 자동으로 동기화되지 않아요. 따라서 우리가 주기적으로 “Upstream의 새 커밋을 가져와서(Fetch) 내 브랜치에 합쳐주고(Merge), 내 Origin으로 밀어 올리는(Push)” 동기화 작업을 진행해야 한답니다.
로컬 PC의 Git 저장소는 기본적으로 ‘origin’만 알고 있습니다. 터미널에서 원본 저장소의 커밋을 직접 땡겨오려면 원본 주소를 ‘upstream’이라는 별칭으로 등록해 주어야 합니다.
2. 가장 간단한 방법: GitHub 웹 UI로 3초 만에 동기화하기 🌐
터미널 명령어가 아직 낯설거나 복잡한 충돌이 없을 때는 깃허브 웹사이트에서 버튼 클릭 몇 번으로 아주 깔끔하게 동기화할 수 있어요. 깃허브가 공식 지원하는 Sync fork 기능을 활용하는 방법입니다.
- 내 깃허브 계정의 Fork된 저장소 메인 페이지로 이동합니다.
- 상단 브랜치 목록 바로 아래에 “This branch is X commits behind [원본저장소]:main.” 알림 문구를 확인합니다.
- 우측에 위치한 [Sync fork] 드롭다운 버튼을 클릭합니다.
- 초록색 [Update branch] 버튼을 누르면 원본의 최신 커밋이 내 GitHub 저장소로 즉시 머지됩니다.
| 동기화 방식 | 장점 | 단점 및 주의사항 | 적합한 상황 |
|---|---|---|---|
| GitHub 웹 UI (Sync fork) | 명령어 입력 없이 버튼 한 번으로 빠르고 직관적임 | 충돌 발생 시 웹상에서 해결하기 번거로움, 로컬 PC에서 추가 pull 필요 | 충돌이 없는 단순 최신 상태 유지 시 |
| 터미널 CLI (Upstream 설정) | 로컬 개발 환경과 즉시 동기화, 충돌 해결 및 리베이스 유연함 | 원격지 등록 및 명령어 단계 학습이 필요함 | 실제 코드 작업을 로컬에서 진행하는 개발 환경 |
웹에서 [Sync fork] 버튼을 눌러 내 GitHub 원격(Origin)을 최신화했더라도, 내 컴퓨터 로컬 환경에는 자동으로 반영되지 않습니다! 로컬 터미널에서 반드시
git pull origin main을 실행해 로컬 브랜치까지 당겨와야 합니다.
3. 터미널(CLI) 환경에서 완벽하게 동기화하는 4단계 💻
실무 프로젝트나 오픈소스 컨트리뷰션에서는 터미널을 활용한 동기화가 훨씬 안전하고 확실합니다. 딱 4개의 표준 단계만 기억하면 누구나 쉽게 마스터할 수 있어요.
📝 CLI 표준 동기화 프로세스 요약
1단계: 원격 저장소 목록 확인 (git remote -v)
2단계: 원본 저장소를 upstream으로 추가 (git remote add upstream [원본URL])
3단계: 원본 커밋 최신화 및 병합 (git fetch upstream → git merge upstream/main)
4단계: 내 GitHub 원격에 최신화 결과 푸시 (git push origin main)
각 단계별로 터미널에 입력할 구체적인 명령어와 세부 팁을 확인해 볼게요.
1단계: 원격 저장소 목록 확인 및 Upstream 등록
프로젝트 폴더에서 터미널을 열고 현재 등록된 원격 주소를 조회합니다.
출력 결과에 origin만 보인다면 아직 원본 레포가 연결되지 않은 상태예요. 원본 레포지토리의 주소를 복사해 아래 명령어로 등록해 줍니다.
2단계: 원본 저장소(Upstream) 최신 커밋 가져오기(Fetch)
원본의 최신 브랜치와 커밋 이력을 내 로컬 메타데이터로 땡겨옵니다. 이때 로컬 파일이 바로 바뀌지는 않으니 안심하세요!
3단계: 로컬 메인 브랜치로 전환 후 병합(Merge)
내 로컬의 메인 브랜치로 이동한 뒤 upstream의 메인 브랜치 커밋을 합쳐줍니다. (프로젝트 기본 브랜치명이 master인 경우 master로 입력)
git merge upstream/main
4단계: 내 Fork 저장소(Origin)로 최종 Push
로컬에서 깔끔하게 병합된 최신 코드를 내 깃허브 원격 저장소에도 반영해 줍니다.
4. 맞춤형 Git 동기화 명령어 자동 생성기 🔢
매번 명령어를 일일이 타이핑하거나 오타를 낼까 봐 불안하신가요? 아래 도구에 동기화할 원본(Upstream) 깃허브 주소와 기본 브랜치명을 입력하고 버튼을 눌러보세요. 복사해서 바로 터미널에 붙여넣을 수 있는 원클릭 명령어 세트를 만들어 드립니다!
🔢 Git Upstream 동기화 명령어 생성 도구
5. 충돌(Conflict) 해결과 Merge vs Rebase 현명한 선택 👩💼👨💻
내 포크 저장소에서도 자체적으로 코드를 수정하고 커밋해 둔 상태라면, 원본의 최신 변경사항과 합치는 과정에서 높은 확률로 충돌(Merge Conflict)이 일어날 수 있어요. 이럴 때 당황하지 않고 대처하는 방법이 있습니다.
실무에서는 상황에 따라 merge 대신 rebase를 선택하기도 하는데요, 두 방식의 핵심 차이를 알아두면 프로젝트 상황에 맞춰 똑똑하게 선택할 수 있습니다.
- Merge (권장):
git merge upstream/main은 원본의 커밋과 내 커밋을 합치며 별도의 머지 커밋을 만듭니다. 히스토리가 있는 그대로 보존되므로 안전하고 초보자에게 권장됩니다. - Rebase:
git rebase upstream/main은 내 작업 커밋들을 잠시 떼어내고, 원본의 최신 커밋을 밑바닥에 깐 뒤 그 위에 내 커밋을 다시 얹는 방식입니다. 커밋 히스토리가 한 줄로 깔끔해지지만, 강제 푸시(git push -f)가 필요할 수 있어 주의가 필요합니다.
충돌이 발생했다면 VS Code나 IDE의 충돌 해결 에디터에서 들어갈 코드를 선택한 뒤,
git add . 후 git commit을 진행하면 안전하게 동기화가 마무리됩니다.
실전 예시: 오픈소스 PR 전 동기화 시나리오 📚
동기화가 실제로 어떻게 이루어지는지 구체적인 가상 시나리오를 통해 살펴볼게요. 오픈소스 프레임워크에 버그 패치 기여를 준비 중인 개발자 민우 씨의 실제 작업 과정입니다.
사례 주인공 민우의 상황
- 2주 전 오픈소스 레포를 Fork 떠서 로컬 feature 브랜치에서 버그 수정 완료
- 그사이 원본(Upstream) 저장소 메인 브랜치에 신규 릴리즈 커밋 18개가 추가됨
민우의 동기화 해결 과정
1) 로컬 main으로 전환 후 upstream의 최신 커밋 18개를 땡겨와 머지 완료
2) 버그 수정을 진행했던 내 작업 브랜치로 이동(git checkout fix-issue)
3) 최신화된 로컬 main을 작업 브랜치에 병합(git merge main)
최종 결과
– 결과 1: 원본의 18개 신규 커밋과 민우의 버그 수정 코드가 충돌 없이 결합됨
– 결과 2: 원작자에게 보낸 Pull Request가 “Able to merge” 상태로 깔끔하게 승인됨
민우 씨처럼 항상 원본의 최신 코드를 로컬 main에 먼저 맞추고, 그 후 내 작업 브랜치로 머지하는 습관을 들이면 대규모 협업에서도 충돌 걱정 없이 쾌적하게 작업할 수 있어요.
마무리: 핵심 내용 요약 📝
오늘 다룬 Fork 저장소 최신화 동기화 방법의 핵심 포인트를 다시 한번 요약해 드릴게요.
- 역할 분담: 내 포크 저장소는 Origin, 원작자의 원본 저장소는 Upstream으로 관리합니다.
- 가장 빠른 방법: 충돌이 없는 단순 최신화는 깃허브 웹페이지의 Sync fork → Update branch 버튼이 가장 빠릅니다.
- 터미널 핵심 공식:
git fetch upstream→git merge upstream/main→git push origin main3단 콤보를 기억하세요. - 작업 전 필수: 새로운 기능 개발을 시작하기 전에는 무조건 동기화부터 먼저 진행하는 것이 협업의 황금률입니다.
Fork 저장소 동기화 핵심 카드
자주 묻는 질문 ❓
git remote add upstream [URL] 명령어로 한 번만 등록해 두면 로컬 Git 설정 파일(.git/config)에 저장되므로, 다음부터는 곧바로 git fetch upstream 단계부터 실행하시면 됩니다.git pull은 내부적으로 fetch와 merge를 동시에 수행하므로, 원본의 어떤 커밋들이 변경되었는지 검토할 기회 없이 바로 병합되어 충돌 시 원인 파악이 어려울 수 있습니다. 실무에서는 fetch로 확인 후 merge하는 과정을 권장합니다.git merge --abort 명령어를 입력하면 병합을 시작하기 전의 안전한 상태로 즉시 되돌릴 수 있습니다. 리베이스 중이었다면 git rebase --abort를 실행하시면 됩니다.git checkout feature-branch로 이동하여 git merge main을 실행하면 내 작업 브랜치에도 원본의 최신 코드가 안전하게 반영됩니다.
Fork한 저장소를 원본과 늘 최신으로 유지하는 것은 오픈소스 협업과 개인 프로젝트 관리의 가장 기본적이면서도 중요한 습관이에요. 오늘 알려드린 웹 버튼 방식과 CLI 4단계 명령어를 천천히 따라 해보시면서 나만의 워크플로우로 익혀보세요! 작업 중 헷갈리는 부분이나 충돌 해결에 어려움이 있다면 언제든 댓글로 편하게 질문 남겨주세요~ 😊