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'
원본 프로젝트 저장소 upstream
의 master
브랜치의 내용을 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