개발/Git

[Git] GitHub fork와 upstream을 활용한 안전한 Pull Request

growing-dev 2023. 2. 4. 22:21

GitHub fork와 원본 upstream을 활용하여 안전하게 sync 하고 pull request를 요청하는 방법에 대해서 알아보도록 하겠다.

오늘의 실습은 오픈소스 CMake를 fork하고 안전하게 반영하고 pull request를 요청하는 식으로 해보겠다.

물론 테스트로 하는 것이고 실제로 무언가 반영하는 것은 아니다.

https://github.com/Kitware/CMake

 

GitHub - Kitware/CMake: Mirror of CMake upstream repository

Mirror of CMake upstream repository. Contribute to Kitware/CMake development by creating an account on GitHub.

github.com

 

GitHub fork와 upstream을 활용한 안전한 Pull Request

  • 1. GitHub fork 
  • 2. fork repository clone 및 upstream 등록
  • 3. fork와 upstream의 동기화
  • 4. pull request 등록

 

 

1. GitHub fork

fork는 기존 원래 repository를 복사하는 개념이다. 원하는 repository를 나만의 공간에 복사해 놓고 여기에 원하는 수정을 해서 여러 가지 실험을 해볼 수 있고, 만약 버그를 발견한다면 내 fork repository에서 원래 repository로 반영을 요청하는 pull request를 요청할 수도 있다.

오른쪽 상단에 Fork를 클릭하자.

 

그럼 다음과 같은 화면이 나오고 특별히 원하는 설정이 없으면 Create fork를 누르면 된다.

 

살짝 가리긴 했지만 왼쪽 위에 forked from Kitware/CMake 라고 되어 있는 것을 볼 수 있다.

이렇게 하면 내 fork repository를 만든 것이다.

내 Repositories 에 가 보아도 잘 생성된 것을 볼 수 있다.

 

 

2. fork repository clone 및 upstream 등록

이제 fork repository를 origin으로 clone 하고 원래 repository를 upstream으로 등록하겠다. 이렇게 하는 이유는 fork를 origin으로 생각하고 거기다가 마음대로 반영하는 것이 더 안전하고 마음 편하기 때문이다. 혹시나 push를 실수해하더라도 default origin으로 갈 수 있기 때문이다.

위와 같이 local에 fork repository를 clone한다. git branch -avv로 현재 branch 정보를 확인한다. origin/master를 가리키는 local master branch가 생성되었다. 즉 현재는 fork branch를 origin으로 가리키고 있다.

git clone https://github.com/xxx/CMake.git
git branch -avv

 

 

이제 원래 CMake repository를 upstream을 등록할 차례이다. 일반적으로 upstream으로 표시하지만, 원하는 이름으로 변경해도 된다. git remote update를 통해 최신 상태로 업데이트하고, remote -v로 확인해 보면 upstream이 Kitware/CMake 쪽으로 잘 등록된 걸 확인할 수 있다.

git remote add upstream https://github.com/Kitware/CMake.git
git remote update
git remote -v

 

git branch -avv를 통해 다시 정보를 확인해보면 origin/~ 과 upstream/~ 이 등록되어 있는 것을 확인할 수 있다.

git branch -avv

 

 

3. fork와 upstream의 동기화

이제 중요한 동기화 차레이다.

여기 예제에서는 master branch를 수정하고 싶다고 가정하겠다.

현재 HEAD는 origin/master를 가리키고 있다.

우선 upstream을 최신 상태를 제대로 다시 업데이트한다.

git fetch upstream

 

upstream/master의 내용을 merge나 rebase로 업데이트한다. 이때 conflict이 발생하면 해결해야 한다.

git merge upstream/master

 

현재 상태를 origin으로 push 한다.

git push origin

 

이때 만약 현재 상태로 sync를 맞추고 싶다면 git push origin -f를 통해 강제 push 해준다.

git push origin -f

 

 

 

4. pull request 등록

이제 내 fork repository의 내용이 업데이트되고, 원래 CMake repository와 달라졌다.

만약 내가 수정한 사항을 원래 repo에 반영하고 싶다면 pull request를 요청하면 된다.

아래 사진은 임의의 fork branch에서 pull request를 요청하려는 예시이다. compare across forks를 통해 원하는 branch를 선택하면 자동으로 diff를 분석해서 띄어준다. 지금은 master branch 간에 1개의 commit이 다르고, Cream pull reuqest를 통해 요청하고, 리뷰받고 실제 반영이 될 수 있다.

 

 

결론

이번에는 fork repo와 원래 repo를 두고, 원래 repo를 upstream으로 등록하여 작업하는 예시를 설명하였다. 실제로 많은 오픈소스 프로젝트들에서 사용하는 방법으로 일반적이라고 할 수 있겠다. 처음 하면 origin(fork)와 upstream이 헷갈려서 실수할 수도 있지만 그 대부분의 실수가 fork 쪽에 반영된다는 점이 안전하게 작업할 수 있는 방법이 될 것이다. 따라서 대체로 이 방식에 익숙해지는 것이 좋지만 여러 실험을 통해 안전하고 나와 내 프로젝트 상황에 맞는 최적화된 나만의 방법을 찾는 게 중요할 것이다.

 

반응형