Merging between forks and upstream in Github
June 16, 2017
상류(Upstream)와 지류(Forks)
깃텁에서는 다른 사람의 저장소를 자신의 저장소로 옮겨 작업을 할 수 있는 기능이 있다. 이름하여 포크(Fork)라고 한다. 보통 원작자의 저장소는 상류(Upstream)라고 부르기 때문에 우리말로 옮기자면 갈래 혹은 지류 정도로 해석할 수 있겠다.
포크는 클론(Clone)과 다른 의미로 사용된다. 클론은 원격(Remote) 저장소에 있는 소스를 로컬 저장소로 복사하는 것을 의미하는 반면, 포크는 다른 사람의 원격 저장소를 나의 원격 저장소로 복사하는 기능이다. 이는 다른 사람이 만든 것을 나의 저장소로 가져와 자유롭게 변경하여 공유하거나 원래의 소스를 개선하는데 기여할 수 있다는 의미를 가질 것이다.
지류에서 상류로 합치기
지류 저장소에서 상류 저장소로 합치는 방법은 Pull Request 기능을 이용하는 것이다. 깃텁 사이트에서 Pull Request를 만들면 원작자에게 어떤 부분이 변경되었는지 알려주기 때문에 관리자는 요청을 수락할 지 거절할 지 결정할 수 있다. 만약 관리자가 수락한다면 깃텁은 요청이 온 소스를 합치게 된다. Pull Request는 지류 저장소에 Push 한 후 깃텁 사이트에서 만들 수 있다.
상류에서 지류로 합치기
위의 상황과 반대로 상류 저장소가 갱신 되었고 자신의 지류 저장소를 거기에 맞게 갱신해야 하는 일이 생길 수 있다. 사실 이 부분을 설명하기 위해 upsteam
에 대한 얘기를 꺼냈다.
보통 포크 후 로컬 저장소로 클론을 받았다면 remote.origin.url
값에 자신의 원격 저장소 주소가 지정되게 된다. 이는 다음 명령어를 통해 확인할 수 있다.
$ git config --list
상류 저장소의 갱신 내용을 로컬에 적용하기 위해서는 리모트의 주소를 다른 이름으로 추가해줘야 하는데 이때 저장소의 이름으로 upstream
을 사용할 수 있다. (사실 이부분은 아무렇게나 지어도 된다. 하지만 의미가 명확한게 낫지 않을까?)
$ git remote add upstream https://github.com/[username]/[proejct_name].git
이제 깃 설정에 원격 저장소 주소가 두개가 되었다. 만약 상류 저장소의 갱신 내용을 로컬에 받으려면 다음과 같이 하면 된다.
$ git pull upstream master
물론 pull
명령어는 fetch/merge
를 한꺼번에 하는 것이므로 다음과 같이 해도 된다.
$ git fetch upstream
$ git merge upstream/master
이제 자신의 지류 저장소를 갱신하면 된다.
$ git push origin master