홈 › GitHub › 05 / 5

포크와 오픈소스 기여

섹션 7진행 0 / 5

3. 코드 예제

예제 1: upstream 준비와 포크·클론 — 01_fork_contribute.sh 발췌

bash
git init -q --bare -b main "$UPSTREAM"
git clone -q "$UPSTREAM" "$WORK/MAINT"
# ... LICENSE, CONTRIBUTING.md, CODE_OF_CONDUCT.md 커밋 ...

# GitHub 의 Fork 버튼은 서버에 저장소를 그대로 복사한다.
# 폐쇄망에서는 --bare clone 으로 같은 결과를 재현한다.
git clone -q --bare "$UPSTREAM" "$FORK"
git clone -q "$FORK" "$WORK/DEV"
cd "$WORK/DEV"
git remote add upstream "$UPSTREAM"
git remote -v
text
warning: You appear to have cloned an empty repository.
CODE_OF_CONDUCT.md
CONTRIBUTING.md
LICENSE
README.md
lib.txt
origin  WORK/fork.git (fetch)
origin  WORK/fork.git (push)
upstream  WORK/upstream.git (fetch)
upstream  WORK/upstream.git (push)

첫 push 전의 빈 저장소 경고는 정상입니다. git remote -v 에 origin(포크)과 upstream(원본)이 함께 보이면 포크 모델 준비가 끝난 것입니다.

예제 2: DCO 서명 커밋과 push, PR 화면 — 01_fork_contribute.sh 발췌

bash
git switch -q -c fix/9-typo
sed -i 's/smal library/small library/' README.md
git add README.md
git commit -q -s -m "fix: README 오타 수정

Fixes #9"
git log -1 --format='%H%n%an <%ae>%n%B'

git push -q -u origin fix/9-typo
text
b2e0e333c89405facf0dd914ca77595eb5bc18c1
kim <kim@example.com>
fix: README 오타 수정

Fixes #9

Signed-off-by: kim <kim@example.com>

-- PR 화면은 이렇게 보인다 --
base: example-org/lib:main  <-  compare: mydev/lib:fix/9-typo
wants to merge 1 commit into example-org:main from mydev:fix/9-typo
title: fix: README 오타 수정
checks: DCO - Signed-off-by 확인됨

커밋 메시지 끝에 Signed-off-by 줄이 자동으로 붙은 것을 확인할 수 있습니다. PR 화면은 "어느 저장소의 어느 브랜치를 어디로 합치는지" 를 base·compare 두 줄로 보여줍니다.

예제 3: upstream 이 앞서간 뒤 동기화와 rebase — 01_fork_contribute.sh 발췌

bash
# MAINT 에서 upstream main 에 다른 커밋이 먼저 들어간 상태

cd "$WORK/DEV"
git fetch -q upstream
git switch -q main
git merge -q --ff-only upstream/main
git push -q origin main

git switch -q fix/9-typo
git rebase main
git push -q --force-with-lease origin fix/9-typo
git log --oneline --graph -5
text
Rebasing (1/1)Successfully rebased and updated refs/heads/fix/9-typo.
* 4fa0856 fix: README 오타 수정
* 0881267 feat: 문구 정리
* 2e52dde chore: 초기 커밋과 기여 문서

main 을 먼저 fast-forward 로 맞추고 나서 작업 브랜치를 그 위로 rebase 하면, 내 커밋 하나만 최신 이력 맨 위에 깔끔하게 얹힙니다.

예제 4: 유지보수자의 병합과 브랜치 정리 — 01_fork_contribute.sh 발췌

bash
cd "$WORK/MAINT"
git remote add contributor "$FORK"
git fetch -q contributor fix/9-typo:refs/remotes/contributor/fix/9-typo
git switch -q main
git merge --no-ff -q -m "Merge pull request #31 from mydev/fix/9-typo: README 오타 수정" contributor/fix/9-typo
git push -q origin main
git log --oneline --graph -5
text
*   5affdcd Merge pull request #31 from mydev/fix/9-typo: README 오타 수정
|\
| * 4fa0856 fix: README 오타 수정
|/
* 0881267 feat: 문구 정리
* 2e52dde chore: 초기 커밋과 기여 문서

유지보수자는 기여자의 포크를 임시 원격으로 추가해 해당 브랜치만 받아 병합합니다. 병합 뒤에는 기여자도 다시 fetch upstream 으로 포크를 최신화해야 합니다.