[TIL] GitHub를 통한 협업

pull, push만 해보고 제대로 사용하고 있지 않았던 git..

이번에 프로젝트를 시작하면서 몰랐던 것들을 하나씩 정리했다.


Local & Remote

편의상 로컬 머신에 존재하는 모든 repository는 local이고

GitHub에 존재하는 모든 repository는 remote라고 한다면,

우선 로컬에 repository를 만드는 방법은 위에서 말한 것처럼 크게 두 가지가 있다.

A. 로컬에서 git init으로 새로운 git repository 생성

B. 깃허브에서 새로운 repository를 만든 후 git clone해서 가져오기

이렇게 만든 local과 remote는 모두 그 자체로 완전한 버전 관리 시스템이다.(= 형상관리)

그래서 local과 remote의 작업 내용을 서로 반영하기 위해 push와 pull이라는 작업을 하게 된다.

push는 local에서 remote로 commit 이력을 업로드하는 것

pull은 remote에서 local로 commit 이력을 다운로드하는 것(update)

Upstream & Downstream

GitHub에서 repo를 생성하고 나면 다들 origin이라는 용어를 볼 수 있다.

clone했을 때는 origin이 자동으로 등록돼있고, init 했을 시

git remote add origin ...으로 origin을 직접 등록하라고 한다.

여기서 말하는 origin이 깃허브에 존재하는 repository

즉, remote를 말한다.(remote에 origin이라는 이름을 붙인 것뿐!, remote == 원격)

origin과 local을 기준으로 생각하면 origin이 upstream, local이 downstream이 된다.

why ? push와 pull을 기준으로 생각했을 때 origin으로부터 local로 흐르는 관계가 형성되기 때문에.

만약 CLI로 push를 한다면 git push -u origin main 이라는 명령어를 입력했을 텐데,

여기서 -u 옵션이 --set-upstream 옵션의 줄임으로 upstream을 설정한다는 뜻이다.

자동으로 origin의 main 브랜치로부터 push와 pull을 진행하는 이유

upstream을 한 번 설정하고 나면 다음부터는 git push 또는 git pull이라고 명령어만 입력해도

자동으로 origin의 main 브랜치로부터 push와 pull을 진행하는 이유는

upstream 옵션을 통해 해당 브랜치에서 upstream과 downstream 관계가 설정됐기 때문에

Fork

GitHub에서 오픈소스 프로젝트에 기여한다거나, 협업을 진행할 때 fork를 이용한다.

fork는 다른 사람의 repository를 내 소유의 repository로 복사하는 것!

따라서 원래 소유자의 remote repository와 내가 fork한 remote repository 사이에도

upstream과 downstream이라는 관계가 형성이 된다.

그래서 보통 원래 소유자의 remote를 말할 때 upstream,

내가 포크한 remote를 말할 때 origin이라는 용어를 사용할때도 있다.

local과 origin의 관계에선 local이 downstream,

origin이 upstream이었는데,

fork한 repository를 기준으로 보면 origin이 downstream,

원본 remote가 upstream이라는 관계가 된다.

그래서 GitHub로 협업을 할 때는 보통 다음과 같은 프로세스를 거치게 된다.

1. 원본 remote repository(upstream) 깃허브에서 fork

2. fork한 remote repository(origin)  클라이언트로 clone

3. clone한 repository(local) commit , local에서 origin으로 push (기능을 완성할 때까지 반복)

4. upstream에 반영하기

A .PR을 등록하기  upstream에 바뀐 내용이 없는 경우

origin에서 upstream으로 PR(Pull Request)

B. PR을 등록하기  upstream에 바뀐 내용이 있는 경우

upstream을 local로 pull, local에서 origin으로 push

origin에서 upstream으로 PR(Pull Request)