티스토리 뷰

# TL;DR

git remote add upstream ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git
git fetch upstream
git merge upstream/master

# 들어가며

GitHub 에서 좋은 프로젝트를 발견했고 유용하게 사용을 하다보면 Contribution 하고 싶은 상황이 생깁니다. 개발자라면 보통 그래요. 이제 Contribution 을 마음먹었으니 프로젝트를 fork 하고 열심히 수정을 합니다. 그리고 Pull Request 를 날리겠죠. 며칠 후에 기분 좋은 메일이 왔습니다. Merged 되었다는 내용이죠 :-)

여기까지는 좋습니다. 그리고 시간이 흘러 같은 프로젝트에 또 Contribution 하고 싶은게 생기게 됩니다. 여기서 문제가 생기게 되는데요. 원본 소스는 많은 개발자들에 의해 계속 소스코드가 발전해나갔지만 내가 fork 해놓은 브랜치는 예전 상태 그대로 멈춰있다는 것이죠.  아래 그림을 봅시다.

내가 기여한 이후에 다른 누군가에 의해 원본 소스는 계속 변화되었습니다. 결국 내가 갖고 있는 소스는 오래된 것이 되버린 것이죠. 이 상황에서 소스를 수정하고 Pull Request 를 하게 되면 conflict 의 늪에 빠지게 될 겁니다. 요즘은 GitHub 이 잘 되어 있어서 브라우저 상에서 conflict 를 풀어내는게 가능은 하지만 너무 많은 변화가 있었다면 이것도 쉽지는 않을 겁니다.  

이때 필요한 것이 1) upstream 등록 2) upsream 으로부터 소스코드 동기화 입니다. ( 아, 물론 fork 했던 레포를 날려버리고 새롭게 fork 해도 상당히 깔끔합니다. 내 깃헙에서 작업했던 히스토리가 중요하지 않다면요 )

# upstream 등록

보통 원본 소스코드가 있는 곳의 위치를 upstream 이라고 명명합니다. 이 이름으로 원본소스의 위치를 등록해줘야 합니다. 아래 Kaldi 예제를 통해 살펴보겠습니다. 미리 KaldiGitHubjybaek 의 공간에 fork 해뒀고 이를 clone 했습니다. 일반적인 과정입니다.

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

여기에 upstream 이라는 이름으로 원본 소스코드의 위치를 추가시켜봅시다. 여기 빨간 부분만 여러분에게 필요한 경로를 지정해주면 됩니다.

git remote add upstream https://github.com/kaldi-asr/kaldi.git

제대로 추가 되었는지도 확인해줍니다.

$ git remote -v
origin	https://github.com/jybaek/kaldi.git (fetch)
origin	https://github.com/jybaek/kaldi.git (push)
upstream	https://github.com/kaldi-asr/kaldi.git (fetch)
upstream	https://github.com/kaldi-asr/kaldi.git (push)

잘 등록 되었죠? 혹시 주소를 잘못 저장했어도 걱정하지마세요. 아래처럼 삭제하고 다시 추가해주면 되니까요.

git remote remove upstream

아무튼 이제 upstream 이 등록되었고, 이 주소로부터 소스코드를 동기화 하도록 합니다.

# 동기화

일단 fetch 명령어를 통해 원본 소스코드의 내용을 로컬에 내려 받습니다. 사용법은 다음과 같습니다.

git fetch upstream

실제 사용해보고 터미널에 출력되는 내용을 확인해볼까요?

$ git fetch upstream
remote: Enumerating objects: 34, done.
remote: Counting objects: 100% (34/34), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 38 (delta 27), reused 32 (delta 27), pack-reused 4
Unpacking objects: 100% (38/38), done.
From https://github.com/kaldi-asr/kaldi
 * [new branch]          5.0                      -> upstream/5.0
 * [new branch]          5.1                      -> upstream/5.1
 * [new branch]          5.2                      -> upstream/5.2
 * [new branch]          5.3                      -> upstream/5.3
 * [new branch]          5.4                      -> upstream/5.4
 * [new branch]          cudnn                    -> upstream/cudnn
 * [new branch]          jtrmal-patch-1           -> upstream/jtrmal-patch-1
 * [new branch]          master                   -> upstream/master
 * [new branch]          multitree                -> upstream/multitree
 * [new branch]          reorthonormalize-cleaned -> upstream/reorthonormalize-cleaned
 * [new branch]          revert-3018-pr           -> upstream/revert-3018-pr

와, 짧은 시간동안 많이 바뀌었네요. 아직 끝이 아닙니다. 내려받은 소스코드를 실제 내 repositorymerge 시켜줘야 합니다. 다음과 같이 진행하면 됩니다.

git merge upstream/master

자, 위에 커맨드를 터미널에서 실행해보죠.

$ git merge upstream/master
Updating 05d9a3d5e..afc5e78c2
Fast-forward
 .gitignore                                             |   1 +
 egs/babel/s5d/conf/lang/404-georgian.FLP.official.conf |   4 +--
 egs/babel/s5d/local/make_L_align.sh                    |  14 +++++++---
 egs/heroico/s5/cmd.sh                                  |   1 +
 egs/heroico/s5/local/heroico_download.sh               |  37 --------------------------
 egs/heroico/s5/local/subs_prepare_data.pl              |   2 +-
 egs/heroico/s5/run.sh                                  |  22 +++++++++++-----
 egs/voxforge/s5/local/voxforge_prepare_dict.sh         |   2 +-
 src/base/kaldi-error.cc                                |   8 ++++--
 src/decoder/grammar-fst.cc                             | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 src/decoder/grammar-fst.h                              |  17 ++++++------
 src/doc/grammar.dox                                    |   2 +-
 src/feat/mel-computations.h                            |   2 +-
 src/online/online-feat-input.h                         |  38 +++++++++++++++++++++++----
 14 files changed, 203 insertions(+), 71 deletions(-)
 delete mode 100755 egs/heroico/s5/local/heroico_download.sh

이제 내쪽 repository 와 원본코드가 존재하는 repository 가 동기화 되었습니다. 빠르게 변하는 프로젝트일수록 동기화는 매우 중요합니다. 코드를 수정하거나 반영하기 전에 항상 동기화 해주는 습관이 필요하겠습니다.



댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday