04. GitHub 오픈소스에 기여하기

GitHub 오픈소스에 기여하기

Fork 및 Clone

출처: About forks

Fork는 원본 프로젝트의 저장소에 아무런 영향을 미치지 않고 직접 관리할 수 있는 원본 저장소의 사본이다.

Github에서 오픈소스 프로젝트의 Fork는 아래와 같은 일을 할 수 있다.

  • 원본 프로젝트 저장소에서 변경사항을 Fork로 반영해 동기화할 수 있다.
  • 여러분이 Fork에서 직접 변경한 사항을 원본 프로젝트에 반영해달라고 요청할 수도 있다.

Fork를 clone하기

$ git clone https://github.com/YOUR_USERNAME/YOUR_FORK.git

Fork와 원본 프로젝트 저장소 연결 설정

출처: Configuring a remote for a fork

Fork와 원본 저장소를 동기화하려면 Fork와 함께 원본 저장소를 올바르게 연결 설정해야 한다.

현재 원격 저장소는 최초 git clone 명령으로 여러분의 Fork만 origin 이름으로 연결되어 있음을 확인할 수 있다.

$ git remote -v
origin  https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch)
origin  https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)

원격의 원본 저장소를 upstream이라는 이름으로 직접 연결 설정한다.

$ git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git

이제 여러분의 Fork 저장소 origin과 원본 프로젝트 저장소 upstream이 올바르게 연결 설정되어 있음을 확인할 수 있다.

$ git remote -v
origin    https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch)
origin    https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)
upstream  https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (fetch)
upstream  https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (push)

Fork와 원본 프로젝트 저장소와 동기화

출처: Syncing a fork

git fetch [원격 저장소 이름] 명령어는 로컬에는 없지만 원격 저장소에는 있는 데이터를 전부 가져온다. 그러면 원격 저장소의 모든 브랜치를 로컬에서 접근할 수 있고 언제든지 Merge하거나 살펴볼 수 있다.

원본 프로젝트 저장소의 이름은 앞서 upstream으로 지었기 때문에 아래와 같이 명령한다.

$ git fetch upstream
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY
 * [new branch]      master     -> upstream/master

여러분의 Fork 로컬 저장소의 master 브랜치로 이동한다.

$ git checkout master
Switched to branch 'master'

원본 프로젝트 저장소 upstreammaster 브랜치의 내용을 Fork 로컬 저장소 master 브랜치에 반영하도록 한다.

git merge upstream/master
Updating a422352..5fdff0f
Fast-forward
 README                    |    9 -------
 README.md                 |    7 ++++++
 2 files changed, 7 insertions(+), 9 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md

위와 같이 동기화할 경우 저장소의 로컬 사본에만 반영된다. Github의 Fork에 반영하려면 반드시 변경사항을 Push해야 한다.

$ git push origin HEAD

git push origin HEAD는 현재 체크아웃한 작업 중 브랜치가 master이므로 git push origin master와 의미가 같다.

PR 보내기

위에서 설명한 것처럼 Github 사이트에서 오픈소스 프로젝트의 Fork를 만들고 연결 설정한다.

토픽 브랜치를 알맞은 이름(예시: issue17)으로 만든다.

$ git checkout -b issue17

필요한 소스 코드를 수정하고 잘 고쳤는지 확인한다.

$ git diff

커밋한다.

$ git commit -am "Issue17 was resolved."

Github에서 Fork한 원격 저장소에 토픽 브랜치를 Push한다. 다음 명령어의 의미는 git push origin issue17과 같다.

$ git push origin HEAD

Github에서 Fork한 저장소에 가면 원본 저장소에 Pull Request를 보낼 수 있는 버튼이 제공된다.

PR이 반영되거나 브랜치가 불필요해지면 브랜치를 삭제한다.

$ git branch -d issue17

다른 기여자의 PR을 가져와 테스트하기

ID는 PR의 #번호의 소스코드를 가져와 BRANCHNAME의 새로운 브랜치를 만든다.

$ git fetch origin pull/ID/head:BRANCHNAME

Fork 저장소 또는 소유권이 있는 저장소 origin이 아닌 다른 원래 프로젝트 주인이 있는 원격 저장소 upstream에서도 소스를 가져올 수 있다.

$ git fetch upstream pull/ID/head:BRANCHNAME

그리고 BRANCHNAME으로 브랜치를 체크아웃하여 작업한다.

$ git checkout BRANCHNAME

최종 수정일시: 2019-01-10 21:01

blog comments powered by Disqus