Lifove Story

Github에서 fork한 저장소 최신 원본으로 동기화 하기 본문

Lifove Programming

Github에서 fork한 저장소 최신 원본으로 동기화 하기

Lifove 2016. 4. 16. 09:35

Git 사용에 익숙해지려고 여러가지를 시도해 보는 중이다.


Github에 있는 오픈소스 프로젝트에 공헌을 하는 방법 중 하나가, 실제 소스코드를 업데이트 하는 일일 것이다. 하지만, 원본 Github 저장소에 검증받지 않은 3자인 개발자의 업데이트를 받아줄리 만무하다. 괜히 그렇게 했다가, 저장소가 검증받지 못한 소스코드 업데이트로 엉망진창이 될 것이기 때문이다. 이런 문제를 방지하면서, 3자 개발자의 공헌을 받는 방법으로, Github에서 주로 사용하는 방식이 fork와 pull request이다. fork는 원본 저장소를 내 github 저장소로 복사하는 것이다. 내 저장소로 복사된 것은, 내가 마음대로 수정해서 업데이트 할 수 있다. 그 다음에, 내가 만든 업데이트가 원본 프로젝트에 도움이 된다고 생각이 들면 Pull request라는 것을 통해, 나의 업데이트를 원본 저장소에서 작업하는 개발자들에게 나의 업데이트를 가져가(pull)라고 요청(request)을 하는 것이다. 이런 과정을 자세히 이해하고 싶은 분들은, https://blog.outsider.ne.kr/865과 https://blog.outsider.ne.kr/866의 블로그 글을 참고하시면 되겠다.


내가 궁금했던 부분은, 내가 fork한 것은 fork한 시점의 소스코드라 만약에 원본이 계속 업데이트 됐으면, 어떻게 다시 나의 fork를 최신 원본과 같게 할까라는 부분이었다. 물론 기존의 fork를 삭제 후, 다시 fork하는 단순한 방법이 있겠지만, 중간에 내가 만든 업데이트가 있었다면, 새로 fork한 곳에 나의 업데이트를 다시 넣어줘야 하는 번거러움이 있다. Github에 이 문제에 대한 도움말이 있다. 요약하면:


(1) 나의 PC에 clone한 fork 저장소에 원본(보통 upstream 이라고 함) 저장소의 github주소를 추가한다.

(2) 나의 PC에 clone한 fork 저장소에서 원본 저장소를 fetch 하고, 나의 저장소에서 master branch를 checkout한 다음, 원본 저장소의 master (upstream/master)를 merge하면 된다. 해당 원본 저장소에 다른 branch가 있다면, 아래 (2) 4번 부터 branch명만 바꾸어 반복해 주면 된다.


(1) 나의 PC에 clone한 fork 저장소에 원본(upstream 이라고 함) 저장소의 github주소를 추가한다. (출처: https://help.github.com/articles/configuring-a-remote-for-a-fork/)


1. 터미널 실행


2. 현재 github 저장소의 원격 주소가 뭔지 확인


$ git remote -v

origin  https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch)

origin  https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)


현재 나의  github 저장소의 주소가 나온다.


3.  원본 (upstream) 저장소의 원격 주소를 추가 한다. upstream대신 다른 이름을 써도 상관없다.


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


4. 원본 저장소의 원격 주소가 잘 추가가 됐는지 확인


$ 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)


(2) 나의 PC에 clone한 fork 저장소를 원본 저장소와 동기화 하기 (출처: https://help.github.com/articles/syncing-a-fork/)


1. 터미널 열기


2. 내 PC의 저장소로 경로 이동


3. 원본을 fetch하기


$ 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


이 과정을 통해 원본 저장소 master branch에 있는 업데이트들이 내 PC upstream/master로 복사가 된다.


4. 내 PC master branch를 체크아웃


$ git checkout master

Switched to branch 'master'


그런데, 이런 에러메시지가 나올 수 있다.

$ git checkout master

error: pathspec 'master' did not match any file(s) known to git. 


이 에러는 master란 이름의 branch를 연결하지 못했다는 말인데, 내 원격 저장소에서는 분명히 존재하는 branch인데 안나오는게 이해가 안될 수도 있다. 이런 에러가 발생하는 이유는, master 브랜치를 한 번도 checkout하지 않은 상태에서, 다른 원격 저장소(여기에서는 upstream)가 추가되고 데이터가 내 로컬 저장소로 fetch 되면서, master브랜치가 두 개(origin/master 와 upstream/master)가 생겼기 때문이다. 앞에 git fetch upstream 하기 전까지는 에러가 안생겼을 것이다. fetch후 실제 branch정보들이 내 로컬로 저장되면서 같은 이름의 branch가 서로 다른 원격 저장소에 모두 있게 됐고, 그 후 어떤 곳에 연결할지 분명하지 않아서 발생된 에러인 것이다. git help checkout을 통해 도움말을 보면 다음과 같은 부분이 있다.


If <branch> is not found but there does exist a tracking branch in exactly one remote (call it <remote>) with a matching name, treat as equivalent to


         $ git checkout -b <branch> --track <remote>/<branch>


다시 말해, git checkout branch_name을 할 때, 같은 이름을 가진 branch가 오직 하나의 원격 저장소에 존재 한다면, 자동으로 내가 생성하는 branch가 해당 remote 저장소의 같은 branch와 연결이 된다는 의미이다. 원래는 어떤 원격 저장소의 branch와 연결이 되는지 명시적으로 써줘야 하는데, 같은 이름의 원격 저장소 branch가 하나일 경우는, 명시적으로 다 안써줘도 자동으로 연결을 해주겠다는 말이다. 만약에, 위의 에러 메시지를 만났다면, 도움말에 나온 것 처럼, 명시적으로 내 PC에 만드는 master가 어떤 원격 저장소의 master와 연결될 것인지 git checkout master 대신 아래처럼 처럼 써주면 그만이다.


$ git checkout -b master --track origin/master


때로는 사용자의 편의를 위해 default로 실행이 되는 명령어들 때문에, 에러가 발생하면, 이유를 몰라 답답할 때가 많다.


5. upstream/master 업데이트와 나의 master를 합치기 (merge)


$ 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


만약에 내가 master에서 특별히 업데이트 한게 없다면, 단순히 merge만 한다. fast-forward 라고 함.


$ git merge upstream/master

Updating 34e91da..16c56ad

Fast-forward

 README.md                 |    5 +++--

 1 file changed, 3 insertions(+), 2 deletions(-)


그 다음에 git push 하면 나의 github저장소 있는 나의 fork 저장소가 원본 저장소와 동기화 될 수 있다.




이 글이 도움이 되셨으면, 공감을 눌러주세요!

반응형