Fork & Pull Request 워크플로우: 오픈소스 기여 흐름
저장소에 직접 push 권한이 없는 외부 기여자가 fork → clone → branch → push → PR로 변경을 제안하는 전체 흐름, upstream remote로 포크를 동기화하는 법, 그리고 오픈소스 기여 실무 팁을 정리한다.
지난 글에서 Projects로 작업 흐름을 시각화하는 법을 다뤘다. 지금까지 살펴본 PR·리뷰·이슈는 모두 저장소에 쓰기 권한이 있는 팀 내부 협업을 전제로 했다. 그런데 오픈소스 프로젝트나 사내 다른 팀의 저장소에는 보통 직접 push할 권한이 없다. 이때 쓰는 것이 Fork & Pull Request 흐름이다. 원본을 복제한 “내 포크”에서 작업하고, 그 변경을 원본에 PR로 제안한다.
두 개의 원격 저장소
핵심은 원격 저장소가 두 개로 나뉜다는 점이다.
- upstream: 원본 저장소(
org/project). 읽기만 가능, 직접 push 불가 - origin: 내 포크(
me/project). 원본의 복사본이며 내가 마음대로 push 가능
내 포크는 GitHub 계정 안에 있는 독립된 저장소다. 여기에는 자유롭게 브랜치를 만들고 push할 수 있다. 작업이 끝나면 내 포크의 브랜치를 원본 저장소를 향해 PR로 보낸다.
전체 흐름을 명령어로
순서대로 따라가 보자.
# ① GitHub 웹에서 원본 저장소를 Fork (또는 gh CLI)
gh repo fork org/project --clone
# ↑ --clone을 쓰면 fork + clone + upstream 설정까지 한 번에
# 수동으로 한다면:
# ② 내 포크를 clone
git clone https://github.com/me/project.git
cd project
# ③ 작업 브랜치 생성 후 커밋
git switch -c fix/typo-readme
git commit -am "docs: README 오타 수정"
# ④ 내 포크(origin)에 push
git push -u origin fix/typo-readme
push가 끝나면 GitHub이 “Compare & pull request” 버튼을 띄운다. 또는 CLI로 바로 PR을 만든다.
# ⑤ 원본 저장소(upstream)를 향해 PR 생성
gh pr create \
--repo org/project \
--base main \
--head me:fix/typo-readme \
--title "docs: fix typo in README" \
--body "오타를 수정했습니다."
--head me:fix/typo-readme처럼 사용자:브랜치 형식으로 적어 내 포크의 브랜치를 가리킨다. 이 PR은 원본 저장소의 메인테이너에게 가고, 그들이 리뷰 후 머지를 결정한다.
포크를 원본과 동기화하기
오래 작업하다 보면 원본 저장소가 앞서 나간다. 내 포크와 로컬이 뒤처지면 PR에 충돌이 생기기 쉽다. 그래서 원본을 가리키는 upstream 원격을 추가해 주기적으로 동기화한다.
# upstream 원격 추가 (한 번만)
git remote add upstream https://github.com/org/project.git
# 원본의 최신 변경을 받아 내 작업을 그 위로 재정렬
git fetch upstream
git switch main
git rebase upstream/main
# 동기화된 main을 내 포크에도 반영
git push origin main
gh repo sync me/project로 포크의 기본 브랜치를 한 줄에 동기화할 수도 있다. 작업 브랜치는 git rebase upstream/main으로 최신 base 위에 올려 두면 PR이 깔끔하게 머지된다.
오픈소스 기여 실무 팁
- 먼저 CONTRIBUTING.md를 읽어라 — 프로젝트마다 규칙이 다르다
- 큰 변경 전엔 이슈로 합의 — 거절될 PR에 시간 낭비 방지
- 한 PR엔 한 가지 변경만 — 리뷰·머지가 쉬워진다
- 커밋 메시지·코드 스타일은 프로젝트 관례를 따른다
- "Allow edits from maintainers" 체크 — 메인테이너가 직접 손볼 수 있게
마지막 항목은 의외로 중요하다. PR 생성 시 이 옵션을 켜 두면 메인테이너가 작은 수정을 직접 커밋할 수 있어, 사소한 사항으로 왕복하는 일이 줄어든다.
Fork & PR 흐름은 전 세계 오픈소스 협업을 떠받치는 기본 구조다. 권한 없이도 누구나 변경을 제안할 수 있고, 원본의 메인테이너가 품질을 통제할 수 있다 — Git의 분산 모델과 GitHub의 PR이 만나 만들어내는 협업의 정수다. 지금까지 PR·리뷰·이슈·Actions·Projects·Fork까지, GitHub 협업의 큰 그림을 한 바퀴 둘러봤다.
지난 글: GitHub Projects: 칸반으로 이슈와 PR 관리하기
읽어주셔서 감사합니다. 😊