국비교육(22-23)

63일차(1)/GitHub : Pull Request

서리/Seori 2023. 1. 5. 18:25

63일차(1)/GitHub : Pull Request

 

 

- Pull Request 설명

- 팀 프로젝트를 대비해서 깃허브 연습하기

 

 

- 조장이 깃허브에 저장소를 하나 만들면, 나의 깃허브 저장소로 끌고 온다(fork)

- 최초 1회, 그 상태대로 가지고 온다.

- 이 포크된 것을 코딩하려면 내 로컬 저장소로 가져오기! (clone)

 

 

- 내 로컬 저장소에서 내 깃허브는 origin 이라는 이름을 가진다. 받아온 곳. 기원!

- 조장의 깃허브도 원격 저장소로 등록해놓아야 한다!(upstream)

- upstream : 최상위/상류 저장소라는 의미로 사용

 

- 처음에 최초 1회 1) fork, 2) clone, 3) upstream 저장소로 등록 하는 과정이 필요하다.

 

- 각각의 깃허브에 master 브랜치가 있다.

- upstream/master, origin/master, master (로컬 저장소)

 

 

- 추가로 프로젝트를 하려고 한다면(역할분담) 별도의 브랜치를 만들어서 작업한다.

- 내 작업을 upstream 저장소로 올릴 수는 없다. 내 깃허브가 아니니까!

- 내 깃허브(origin)에다가 push 한다. 그러면 origin에 브랜치가 추가된다.

 

- 새 브랜치(login)에서 3개의 commit을 했다고 치자.

- 내 깃허브에 push하고 나면 새 브랜치가 생긴다(origin이 트래킹하는 login 브랜치) 자동으로 만들어진다.

- 그러면 master , origin/master, login , origin/login 4개의 브랜치가 보인다.

 

- push 하면 자동으로 origin/login이 생기면서 깃허브를 트래킹한다.

 

 

- 여기까지 해두면 조장은 이것이 업데이트되었는지 모르기 때문에...

 새 커밋, 새 작업내역이 있다는 것을 조장 깃허브에 알려야 한다.

 

- 이때 하는 것을 Pull Request 라고 한다. (사실상 merge를 요청하는 것이라고 생각하면 된다.)

- 조장에게 내용을 검토해주시고 Merge 해주세요~ 를 요청하는 것!

 

 

- 그러면 조장은 검토하고 master 브랜치에 merge한다.

 (충돌이 발생할 수도 있는데, merge하는 사람이 판단해서 수정+merge하면 된다)

- Fast-Forward 또는 merge commit 으로 새롭게 master 브랜치가 업데이트된다.

 

- 그러면 이제 이것을 내 로컬 저장소로 받아와야 한다!!

 

- upstream/master 의 현 상태를 fetch 해온다.

- fetch+merge 해서 한번에 pull 할 수 있다.(내 local 의 master도 업데이트된 상태)

 

- 내 깃허브(origin)에 push 하기(초록색 화살표)

- 그러면 master 와 origin/master의 히스토리가 같아진다.

 

- 다 동일하게 업데이트 되고 나면 login 브랜치는 지워버려도 된다.

 

- 내 로컬에서 보면 이렇다.

- fetch, push 하는 저장소가 각각 다른 것이다.

 

 

- fetch upstream/master → master(local) 에 merge 

 

- 내 master 브랜치는 오직!! 조장의 깃허브로부터 fetch 받아서 진행시켜야 한다.

- 다양한 작업을 하면서 에러가 발생할 수 있으므로 직접 master에서 commit 하지는 말기..

- 커밋은 새로 만든 해당 브랜치에만 쌓는다!

- merge 되려면 내 깃허브에 올려서 조장에게 requerst 를 날리면 된다.

 

- master에서 커밋하지 말 것! 별도의 브랜치를 사용해서 사고를 방지한다.

- fetch 할 때는 내 워킹트리는 깨끗이 만들어놓고 받아야 한다. 커밋한 직후에! (충돌 방지)

 


 

- 복제해서 가져오기- fork 기능 사용. 깃허브에 로그인해야만 사용할 수 있음!

 (clone 기능은 로그인하지 않아도 사용 가능)

 

- 이렇게 저장소를 내 깃허브에 가지고 왔다. 원하는 위치에 clone하기!

 

- git clone + 저장소 위치 복사한 것을 붙여넣기하면 이렇게 내 파일시스템(local)에 클론되어 나온다

 

 

- 이클립스에서 import하기

 

- 우측상단 깃환경으로 들어가기

- 이클립스에게 새로운 깃 저장소를 알려주기 (Add Existing Local git repo)

 

- 클론했던 폴더로 경로 지정하고, 깃 저장소를 찾아서 add 하면 된다.

 

- 클론만 했는데도 2개의 마스터 브랜치가 존재하게 되었다.

- 로컬의 master , origin의 master

 

- 워킹트리 폴더 안에 저장소 폴더가 있다.

- 프로젝트 폴더를 마우스 우클릭하면 import project 가 있다.

- 선택해서 finish

 

- java 웹 환경으로 돌아가면 해당 프로젝트가 들어와 있는 것을 볼 수 있다.

 

 

- 새로운 작업을 하기 전에는 Branch를 만들어야한다. (Team-Switch to-new branch)

- 뭔가 새로운 작업을 하고 commit 하기

- 가급적 commit+push 를 바로 하지 말기. 단위 기능을 완성시키고 각각의 commit을 모아서 push하기

- 전체적으로 큰 기능이 하나 완성되면! 그때 push하는 것이 좋다.

 

- 다시 깃환경에서,

- 아직 내 local은 조장의 저장소(upstream)을 알지 못한다. 추가해주어야 한다.

 

- 조장의 저장소 위치를 복사해서 remote 에 추가하기l

 

- 이름은 upstream으로, fetch 할 경로로 지정.

 

 

- change를 눌러서 저장소의 소스 등록

 

- 이 상태로 save 하면 된다.

 

- 그러면 upstream 이라는 이름으로 저장된다.

 

 

- 아직 push하지 않아서 origin/master에는 업데이트가 되어 있지 않다.

- 해당 로컬 hello 브랜치에서 마우스 우클릭해서 push

 

- 그러면 remote tracking 브랜치에도 이렇게 새 브랜치가 생겨난다.

 

- 깃허브에 들어가보면 pull request 하겠느냐고 나온다.

- 들어가면 메모와 함께 조장에게 PR을 보낼 수 있다.

 

- 내 로컬은 merge가 된것을 알지 못한다.

- merge할 때는 항상 워킹트리가 깨끗한 상태에서 움직이기! checkout 할 때도 반드시 확인!

 

- checkout 해서 master 브랜치로 옮겨간다음 → upstream으로부터 내려받아서 merge시켜야 한다.

 

- upstream/master 를 가져와서 fetch 하고

 upstream/mater가 생겨나면 내 master와 merge 하기

 

- 새롭게 이것이 생겨난다. fetch 만 해서는 작업 창에서 볼 수 없다. master로 merge해야 한다.

 

 

- merge 할 브랜치에 우클릭해서 Merge 선택

- 내가 현재 master 브랜치에 있는 상태였어야 된다!

 

- 여기까지 완료하고 나면 작업했던 hello 브랜치는 우클릭-delete 해버리면 된다.

 

- 현재 merge된 작업이 내 깃허브(origin)에는 아직 올라가지 않았다.

- origin-push 하면 된다.

 

- 내려받아서(fetch) → local 저장소에서 보고 → origin에 push 하는 것 기억!

- master branch에 커밋하지 말기! 새 브랜치를 만들어서 작업하기

 

- 이렇게 전체 브랜치의 최종 커밋이 일치되도록 해주고 나서,

 또 새로운 브랜치를 만들어서 작업하면 된다.

 


 

- Pull Request 를 보냈는데 만약 reject 된다면?

 

- 새 브랜치를 생성해서 새 작업을 한 후 → commit - push(내 깃허브/origin) → pull request 보내기

 

- PR을 받은 사람이 reject하면 해당 요청이 closed 된 것을 볼 수 있다.

- 그러면 기능을 고쳐서 다시 수정하고, 내 깃허브에 commit+push 후 재요청하면 된다.

 

 

- 상단 pull request 메뉴로 들어가서 직접 상대의 깃허브로 보내주면 된다.

 

- 조장이 merge해주면 master 브랜치로 checkout 하고

 

- upstream/master에서 다시 fetch 하기

 

 

- 그럼 여기 이렇게 최종 merge된 commit이 들어온다.

 

- 이것을 내 로컬 저장소에 merge 해주고,

  merge 완료되면 본인의 깃허브에 push 하면 된다.

 

- 깃허브 push까지 완료되면 브랜치 삭제. 깃허브에서도 브랜치 삭제해주기!

 

- 내 로컬의 master 브랜치에 직접 commit하지 말 것!

- 내 local master 브랜치는 오직 조장으로부터 받아서만 업데이트 되는 것이라고 생각하기.