포스트

[GitHub 100일 챌린지] Day 53 - Upstream 동기화 실전

[GitHub 100일 챌린지] Day 53 - Upstream 동기화 실전

100일 챌린지 Day 53 - Fork한 저장소를 원본(Upstream)과 동기화하는 다양한 방법을 실습합니다.

배울 내용

  1. Upstream 동기화가 필요한 이유
  2. Merge와 Rebase 방식의 동기화
  3. 충돌 해결 및 자동화 스크립트

1. 동기화가 필요한 순간

1
2
3
4
5
# 원본 저장소는 계속 발전
facebook/react: 100 commits ahead

# 내 Fork는 뒤처짐
myname/react: 0 commits ahead, 100 commits behind

동기화 시점:

  • 새 기능 개발 시작 전
  • Pull Request 생성 전
  • 주기적 (매일/매주)

2. Merge 방식 동기화

1
2
3
4
5
6
7
8
9
10
11
12
# 1. Upstream 최신 가져오기
git fetch upstream

# 2. Main 브랜치로 이동
git switch main

# 3. Merge
git merge upstream/main

# 4. 충돌 해결 (필요시)
# 5. Origin에 Push
git push origin main

3. Rebase 방식 동기화

1
2
3
4
5
# 깔끔한 히스토리 유지
git fetch upstream
git switch main
git rebase upstream/main
git push origin main --force-with-lease

Merge 방식은 기록이 안전하고 이해하기 쉽습니다. Rebase 방식은 히스토리가 깔끔하지만, 이미 공유한 브랜치에서 사용하면 다른 사람의 작업과 충돌할 수 있습니다.

방식 장점 주의점
Merge 안전하고 기록이 명확함 merge commit이 생길 수 있음
Rebase 히스토리가 직선으로 정리됨 force push가 필요할 수 있음

초보자라면 main 동기화는 merge 방식으로 시작하고, 팀 규칙을 이해한 뒤 rebase를 사용하는 편이 안전합니다.


4. GitHub 웹에서 동기화

1
2
3
4
1. GitHub에서 내 Fork 페이지 접속
2. "Sync fork" 버튼 클릭
3. "Update branch" 선택
4. 로컬에서 git pull origin main

5. 작업 브랜치 동기화

1
2
3
4
5
6
# 작업 브랜치에 최신 main 반영
git switch feature-branch
git fetch upstream
git merge upstream/main
# 또는
git rebase upstream/main

Pull Request를 보내기 전에는 작업 브랜치가 원본 저장소의 최신 상태와 크게 벌어져 있지 않은지 확인합니다.

1
2
git fetch upstream
git log --oneline --left-right --graph upstream/main...HEAD

왼쪽(<)은 upstream에만 있는 커밋, 오른쪽(>)은 내 브랜치에만 있는 커밋입니다. upstream 변경이 많다면 PR 전에 동기화하고 테스트를 다시 실행하세요.


6. 충돌 해결

1
2
3
4
5
6
7
# 충돌 발생 시
git merge upstream/main
# CONFLICT in file.js

# 파일 수정 후
git add file.js
git commit -m "Merge upstream/main"

Rebase 중 충돌이 났다면 흐름이 조금 다릅니다.

1
2
3
4
git rebase upstream/main
# 충돌 파일 수정
git add file.js
git rebase --continue

어렵거나 잘못된 방향으로 간 것 같다면 중단할 수 있습니다.

1
git rebase --abort

7. 자동화 스크립트

1
2
3
4
5
6
7
#!/bin/bash
# sync-upstream.sh
git fetch upstream
git switch main
git merge upstream/main
git push origin main
echo "✅ Synced with upstream"

스크립트는 편리하지만 충돌이 나면 사람이 판단해야 합니다. 자동화는 “반복 명령 줄이기”에 쓰고, 충돌 해결은 diff를 보며 직접 결정하세요.


8. 실전 동기화 루틴

오픈소스 기여 전에 아래 순서로 정리합니다.

1
2
3
4
5
6
7
8
git switch main
git fetch upstream
git merge upstream/main
git push origin main

git switch feature/my-contribution
git merge main
npm test

프로젝트가 Python이면 pytest, Ruby면 bundle exec rake test처럼 해당 프로젝트의 테스트 명령을 사용합니다.


정리

완료 체크:

  • Upstream을 Merge 방식으로 동기화할 수 있다
  • Rebase 방식의 장단점을 이해했다
  • 충돌을 해결할 수 있다
  • PR 전 작업 브랜치와 upstream 차이를 확인할 수 있다

핵심 요약:

  • git fetch upstreamgit merge upstream/main
  • 정기적인 동기화로 충돌 최소화
  • GitHub 웹에서도 동기화 가능
  • 초보자는 merge 방식으로 안전하게 시작하고, rebase는 팀 규칙을 확인한 뒤 사용

다음: Day 54 - Fork 워크플로우


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.