git fork와 upstream

git은 분산 버전관리 시스템이다.

원격 서버를 거치지 않더라도 버전을 관리할 수 있다.

오픈소스 컨트리뷰톤을 위해 깃허브 수업을 들은 내용을 개인적으로 공부하여 다시 정리해보았다.

remote repository

네트워크 상의 서버에 존재하는 저장소를 remote repository라고 부른다.

local repository

remote에 있는 저장소를 git clone하거나 git init으로 생성해서 로컬에 존재하는 repository를 local repository라고 한다.

push와 pull

local 저장소와 remote 저장소의 작업내용을 반영하기 위해 pushpull이라는 작업을 하게 된다.

  • push: local에서 remote로 commit 이력을 업로드 하는 것
  • pull: remote에서 local로 commit 이력을 다운로드 하는 것

upstream과 downstream

local 기준에서 remote는 upstream, local이 downstream이 된다. remote로부터 local로 흐르는 관계가 되기 때문이다.

초기 저장소에 cli로 push를 할 때 git push -u origin main 명령어를 사용하는데, -u--set-upstream옵션의 줄임말로 upstream을 설정한다는 뜻이다.

upstream을 설정하고 나면 다음부터는 git push 또는 git pull이라고 명령어를 입력하면 자동으로 origin의 main 브랜치로부터 push와 pull을 진행하게 된다.

fork

다른 사람의 저장소를 복사하는 것을 fork라고 한다. 주로 오픈소스 프로젝트에 기여하거나, 협업을 진행하는 경우에 사용한다.

이 경우 원본 remote -> 내가 fork한 remote -> 내 local 순으로 upstream, downstream 관계를 만든다.

때문에 github으로 협업을 할 경우 다음과 같은 프로세스를 거치게 된다.

  1. 원본 remote를 github에서 fork
  2. fork한 remote repository(origin)을 깃 클라이언트로 clone
  3. 기능을 완성할 때 까지 반복
    1. clone한 repository(local)에 commit
    2. local에서 origin으로 push
  4. upstream에 반영하기.
    1. PR을 등록하기 전 upstream에 바뀐 내용이 없는 경우
      1. origin에서 upstream으로 PR
    2. PR을 등록하기 전 upstream에 바뀐 내용이 있는 경우
      1. upstream을 local로 pull
      2. local에서 origin으로 push
      3. origin에서 upstream으로 PR

하지만 보통 pull을 바로 해버리는 것은 위험하다.

때문에 upstream의 변경사항을 미리 확인후에 그걸 반영해서 작업하는 것이 좋다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// upstream에 원본 remote 등록하기
git remote add upstream url
// upstream의 최신 commit history 반영하기
git fetch upstream main
// 베이스 갱신
git rebase upstream/main
// 충돌 사항 확인하기
git diff
// 작업하고 add하기
git add ....
// rebase 변경사항 저장하기(자신의 커밋을 반영)
git rebase --continue
// 지저분한 것들 지워주기
git reset --soft
// 컨플릭트 할 수 있는 상태가 됨
git push origin develop -f
// PR하기

Ref

https://backlog.com/git-tutorial/kr/stepup/stepup2_8.html
https://ihp001.tistory.com/229

댓글