본문 바로가기
Kaggle마스터가 되기 위한 몸부림/git-github

[협업을 위한 git & GitHub] 2. 다른 사람의 원격 저장소로부터 협업하는 방법(Fork, clone, upstream, Pull Request, Merge & Pull)

by Steve-Lee 2021. 2. 2.

안녕하세요 Steve-Lee입니다.

오늘은 '협업을 위한 git & GitHub' 두 번째 시간으로 다른 사람의 원격 저장소(Remote Repository)를 가져와 협업하는 방법에 대해 다뤄보도록 하겠습니다. 

(내용이 조금 많을 수 있습니다 ^^)

그럼 시작하겠습니다!

제 블로그의 글이 도움이 되셨다면 좋아요와 댓글 부탁드리겠습니다.글을 지속적으로 작성하는데 많은 동기부여가 됩니다. 감사합니다. 오늘도 편안한 하루 보내세요!🙏

 

[협업을 위한 git & GitHub] 1. 직관적으로 이해하는 git & GitHub

본 정리노트는 투빅스 10기 정윤호의 Git강의와 강의자료를 바탕으로 작성되었습니다. 안녕하세요 Steve-Lee입니다. 오늘은 '협업을 위한 git & GitHub' 첫 번째 시간으로 git과 GitHub에 대해 알아보도록

deepinsight.tistory.com


<목차>

1. git으로 협업하는 방법

2. Fork

3. clone, upstream 저장소 추가하기

4. branch 생성

5. 수정 작업 후 add, commit, push

6. Pull Request 생성

7. 코드 리뷰 및 Merge Pull Request

8. origin repository에 변경내용 당겨오기


1. git으로 협업하는 방법

  • Intro
    • 가짜 연구소 스터디원으로 Kaggle Master가 되기 위한 몸부림라는 프로젝트를 진행하고 있습니다 [link]
    • 주차별로 스터디원들이 각자 공부한 내용들 또는 팀 단위로 학습한 내용을 공유하는 GitHub Repository를 만들어서 협업을 하게 되었습니다
    • 그동안 개인 github repository는 많이 사용해봤지만 협업을 위한 github(특히 pull request)에는 익숙하지 않아 정리하려고 합니다
  • git으로 협업하는 방법
    • 오늘은 전반적인 프로세스를 다룰 예정입니다
    • 다른 사람의 원격 저장소로부터 코드를 불러와 수정후 기여(contribute)하는 내용이 될 것 같습니다
  • 웹 상에서 도움이 될만한 자료들을 참고한 점 미리 말씀드리겠습니다

 

2. Fork

  • github에서 fork란 다른 사람의 프로젝트를 카피하는 것을 의미합니다
  • 다리(bridge)라고 생각하면 좋을 것 같은데요. original repository(Upstream)와 자신이 copy 한 repository를 연결해준다고 생각하면 좋을 것 같습니다
    • Upstream, origin 등은 뒤에서 다루도로 하겠습니다!
    • 물의 상류가 Upstream인 것처럼 저희가 다리를 놓은 repository의 상위 repository를 Upstream이라고 이해하셔도 좋을 것 같네요! (* 여기서 너무 힘을 쏟지 않으셔도 됩니다! 뒤에서 계속 다룰거에요 ^^)

 

3. clone, upstream 저장소 추가하기

  • fork로 생성한 저의 repository에서 초록색 버튼인 Code를 누르면 Clone을 하실 수 있습니다
  • 이후 자신의 컴퓨터에서 Fork한 저장소를 로컬에 clone 하면 됩니다

 

저는 mac 컴퓨터를 사용하므로 mac의 terminal을 사용했습니다

$ git clone <origin repository 주소>
  • 여기서 <origin repository 주소>란 앞서 Clone을 통해 복사한 주소를 의미합니다

 

협업을 위해서는 한가지 작업이 더 필요합니다. 바로 upstream 저장소를 추가하는 것입니다

다른 사람의 Github 저장소를 Fork한 경우 내 Github 저장소는 origin이 됩니다.
이 때 우리가 처음 fork를 시도한 저장소는 upstream 이라고 부릅니다.
origin과 upstream 모두 remote 저장소입니다. 보통 둘을 구분하기 위해 upstream이라는 명칭을 사용합니다
  • upstream 저장소 추가하기
  • Remote 저장소 목록 확인

upstream 저장소 추가하기

$ git remote add upstream https://github.com/<aUser>/<aRepo.git>
  • aUser/aRepo는 original creator와 repository를 의미합니다

Remote 저장소 목록 확인

$ git remote -v

 

4. branch 생성

  • 자신의 로컬 컴퓨터에서 코드를 추가하는 작업은 branch를 만들어서 진행합니다
# youngjeon 이라는 이름의 branch를 생성합니다

$ git checkout -b youngjeon 
Switched to a new branch 'youngjeon'

# 이제 2개의 브랜치가 존재하게 되는 것입니다

$ git branch
* youngjeon
master

branch를 만들어서 작업하는 이유는 우리가 협업하며 작성한 코드들 또는 작업의 흐름을 관리할 수 있기 때문입니다.

branch를 만들어서 협업 후, branch를 없애기도 합니다.

 

5. 수정 작업 후 add, commit, push

  • 이제 작업을 한 뒤 add, commit , push를 해주면 수정한 작업을 반영할 수 있게 됩니다
  • 이때 수정된 내용은 origin repository(우리가 fork를 떠 온 repository)에 반영되는 것입니다
  • 주의할 점으로는 push 진행 시 brach 이름을 명시해줘야 한다는 것입니다
$ git push origin youngjeon  # branch 이름을 명시해줬습니다

 

6. Pull Request 생성

  • push를 완료하면 본인 계정의 origin repository에 Compare & pull request 버튼이 활성화되는 것을 확인하실 수 있습니다
  • 버튼을 클릭하여 작업 내용에 대한 메세지 작성 후 Pull Request를 진행하면 원본 repository에서 확인 후 Merge 여부를 결정합니다

 

7. 코드 리뷰 및 Merge Pull Request

  • 원본 저장소 관리자는 Pull Request를 읽고 작업 여부 또는 변경 사항을 확인 후 Merge 여부를 결정하게 되는 것입니다

 

8. origin repository에 변경내용 당겨오기

하나 더 알아주실 점이 있습니다.

지금까지 원본 저장소에서 코드를 불러와 협업하는 방법에 대해 알아보았습니다. 

그런데 뭔가 궁금한 점이 있지 않으신가요?

네 그렇습니다.

원본 저장소의 변경된 내역을 origin repository에 어떻게 반영할 수 있을까요?

마지막으로 origin repository에 변경 내용을 당겨오는 방법에 대해 소개해드리겠습니다

지금까지 작업한 내용은 다음과 같습니다

uptream -> (fork) -> origin -> (add/commit/push) -> upstream(merge)
  • upstream으로부터 저장소를 fork해온 origin 저장소에서 작업하여 다시 upstream으로 보냈습니다
  • 다음으로 해줄 작업은 변경된 upstream의 내용을 origin 저장소로 반영하는 것입니다

 

1. upstream 저장소로부터 'fetch'합니다

$ git fetch upstream 

2. 로컬 저장소의 main 브랜치로 checkout 후 머지(merge)를 합니다

(upstream의 변경된 내용을을 취합하는 과정이라고 생각하면 좋습니다)

$ git checkout main
$ git merge upstream/main

3. 자신의 원격 저장소인 origin에 반영하려면 git push를 수행합니다

$ git push

이렇게 함으로써 upstream에서 변경되었던 내용을 origin repository로 반영할 수 있게 되는 것입니다.


Conclusion

지금까지 upstream으로부터 코드를 불러와 작업하는 협업의 과정에 대해 살펴보았습니다.

조금 포스팅이 길어진것 같네요...ㅎㅎ

 

포스팅 내용중 잘못된 점이 있다면 의견 부탁드리겠습니다.

또는 질문이 있으시다면 얼마든지 주신다면 감사하겠습니다.

감사합니다. Steve-Lee였습니다!

 

※ upstream과 origin에 대한 설명을 Appendix로 달아놓았습니다


Appendix. 

Q. What is the difference between origin and upstream on Github?
  • Googling을 통해 stackoverflow에 올라온 답변을 정리해봤습니다
  • origin은 무엇인지, upstream은 무엇인지 정리가 되셨으면 합니다

우선 upstreamorigin에 대한 정의를 간단히 짚고 넘어가 보도록 하겠습니다

  • upstream : 일반적으로는 사용자가 fork 한(The forked) 원격 저장소를 의미합니다
  • origin : 반면 origin은 fork를 해서 나의 원격 저장소가 된 repository를 의미합니다

Github page에는 다음과 같이 정의되어 있습니다

When a repo is cloned, it has a default remote called origin that points to your fork on GitHub, not the original repo it was forked from. To keep track of the original repo, you need to add another remote named upstream

  • 다시 말해 origin은 original repository가 아닙니다
  • 우리가 어떤 유저의(또는 커뮤니티의) repository를 우리의 원격 저장소로 fork해오면 우리의 원격 저장소에 있는 fork repository는 origin이 됩니다
  • 반면 원래의 repository는 upstream이 되는 것입니다
  • 그림으로 이해하면 조금 더 직관적입니다

  • upstream으로부터 fetch를 하게 되면 우리가 contribute를 하기 원하는 프로젝트의 최신 내용을 동기화할 수 있습니다

$ git fetch upstream

  • 이때,이때, 아래의 코드와 같이 명령어를 사용하게 된다면 origin repository로부터 fetch를 하게 됩니다$ git fetch
  • 즉, original repository의 변경 사항을 업데이트하지는 않습니다

Conclusion

  • 결론을 말씀드리면 origin은 original repository가 아닙니다
  • fork repository는 origin이며 forked repository는 upstream이 됩니다

 

Reference

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

What is the difference between origin and upstream on GitHub?

What is the difference between origin and upstream on GitHub? When a git branch -a command is done, some branches have a prefix of origin (remotes/origin/..) while others have a prefix of upstream (

stackoverflow.com

 

git 초보를 위한 풀리퀘스트(pull request) 방법 · 초보몽키의 개발공부로그

개발을 하다 보면 코드를 여러 개로 복사해야 하는 일이 자주 생긴다. 코드를 통째로 복사하고 나서 원래 코드와는 상관없이 독립적으로 개발을 진행할 수 있는데, 이렇게 독립적으로 개발하는

wayhome25.github.io

 

댓글