Profile picture

[GIT] Git pull request (PR)

JaehyoJJAng2022년 03월 05일

코드 기여 Fork - Pull request (PR)

다음과 같은 Jaejjang와 Dojjang 라고 하는 Github Repository가 있다고 가정 해보자.

image

Jaejjang 개발자의 github 에 올려져 있는 crawling 이라는 프로젝트가 현재 dojjang 개발자가 찾던 소스와 비슷하여

Jaejjang 개발자의 프로젝트에 참여해서 기여자(Contribute)로 함께 참여하고 싶다고 한다.

하지만 Dojjang이 다른 사람의 저장소(Jaejjang)에 있는 코드를 수정하거나 추가하려면 관리자(Jaejjang)가 나를 직접 기여자(Contribute)로 등록 해주어야 한다

프로젝트에 참가하고 싶은 사람들을 관리자(Jaejjang)가 일일이 Contribute 해줄 수는 없다.

이럴때 사용하는 것이 Fork 이다

image

Fork 란 다른 사람의 저장소에 있는 레포지토리를 내 원격 저장소, 깃허브로 가져오는 것

위 상황으로 보면 Dojjang 개발자가 Jaejjang 개발자가 올려놓은 프로젝트 중 Crawling 이라는 프로젝트를 Fork 하면 Dojjang github에 Jaejjang 개발자의 Crawling 프로젝트를 가져올 수 있게된다.

  • Fork: 레포지토리를 원격저장소에 복사함

  • Clone: 레포지토리를 로컬저장소에 복사함

image

Dojjang 개발자가 로컬에서 코드를 수정 및 추가 한 후에, 아까 Fork 했었던 Dojjang의 Remote repository에 Commit 한 뒤에

Jaejjang github의 Crawling 프로젝트에도 자기가 수정 및 추가한 코드가 반영 되었으면 좋겠다 생각이 들면 Pull request(PR) 을 보내면 된다

이제 Jaejjang 개발자가 해당 PR의 코드 리뷰를 하고 문제가 없으면 자신의 main branch에 merge를 해서 프로젝트에 기여하도록 하는 방식임

image

Pull Request

수정한 코드가 있으니 내가 작업한 branch를 가져가 관리자가 검토 후 병합해주면 좋겠다 라고 요청 해주는 것

위에서 설명한 상황을 아래와 같이 정리하면 대충 이렇다

  • 내 원격 레포지토리에 상대 레포지토리를 Fork

  • Clone 설정 (git clone)

  • remote 설정 (git remote add ~)

  • branch 생성 (git branch ~)

  • 로컬에서 수정 작업 후 git add , git commit -m , git push (나 뿐만 아니라 타 기여자들(팀원)이 소스를 수정했다면 git fetch로 코드 가져와서 충돌 해결)

  • Pull Request(PR) 생성

  • Merge Pull Request

  • Merge 이후 동기화 및 Branch 삭제

Pull request 실습

1. 원본 저장소를 Fork 하기

기여하기 원하는 레포지토리의 우측 상단 Fork 버튼 눌러 자신의 github 레포지토리에 Fork 하도록 함

image

image

-> ork가 완료되면 내 원격저장소에 해당 레포지토리(Coupang-Review-Crawling)가 복제 된다.

Fork한 저장소 Local로 Clone 하기

작업하기 위해서 Fork한 원격 저장소 소스를 그대로 내가 작업할 Local에 복사해 추가

Clone 버튼을 눌러 표시되는 URL 복사 후 명령어 실행

$ cd ~/git/ # Clone할 로컬 폴더 이동

$ git clone <Remote Repository URL>

원본 저장소 Remote 설정하기

레포지토리를 clone하면 origin 이라는 이름으로 Remote url이 나의 원격 저장소로 기본 설정된다. 하지만 내 원격 저장소 뿐 아니라, 포크 했던 원본 저장소도 같이 remote로 등록 해주는게 좋음. 왜? 나중에 원본 저장소 내용과 동기화 할 때 원본 저장소의 remote repo 주소가 있어야 하기 때문임

# 원격 저장소 remote 등록하기
$ git remote add <별명> <원본 저장소 url>
 
# 원격 저장소 확인
$ git remote -v
 
# mulingJ 라는 별칭으로 원본 저장소를 remote로 등록하기
$ git remote add JaehyoJJang https://github.com/JaehyoJJAng/Coupang-Review-Crawling.git

image

Branch 생성하기

팀과 함께 일할 때 브랜치 분기는 필수 예를 들면, 실제 배포중인 서비스가 있다고 하면 dev 라는 branch를 새로 만들어 현재 배포중인 서비스의 추가할 사항이나 , 수정 , 보완해야할 코드를 작성하고 로컬에서 테스트를 해보며 서비스가 정상적으로 동작이 되면 실제 본 서비스에 dev에서 작업한 내용을 merge 하여 적용 하거나 dev 브랜치에서 수정된 코드로 인해 서비스가 비정상적으로 동작되면 main 브랜치의 내용은 dev 브랜치에서 수정한 코드와는 별개로 그대로 유지 되므로 다시 되돌려서 작업하기도 원활하다. new branch를 만들어 해당 new branch에서 작업한 뒤 , 작업이 완료되면 main branch에 merge 한 후 , branch를 삭제하는 식으로 진행하는게 좋다

# branch 생성
$ git branch <branch 이름>
 
# 브랜치 이동
$ git checkout <branch 이름>
 
# 브랜치 생성 후 해당 브랜치로 이동
$ git checkout -b <branch 이름>
 
# 브랜치 리스트
$ git branch --list
 
# 현재 작업 중인 branch 확인
$ git branch --show-current

image

코드 작업 후 Add | Commit | Push

코드를 수정하거나 기능 추가 작업이 완료되면, 자신의 깃허브 레포지토리(origin)에 Add | Commit | Push 하여 remote에 반영하도록 한다.  -u(--set-upstream) : Local repository에 있는 dev branch가 origin에 있는 dev branch를 tracking(추적) 하도록 설정

$ git add ./
 
$ git commit -m "Add test Function in crawl.py"
 
$ git push --set-upstream origin dev

Pull Request 생성하기

이제 github/repo 에 가면 Compare & pull request 버튼이 활성화 된다. 상단에 버튼 클릭 후, PR 메시지 작성하고 Create pull request 버튼을 누르면 PR 를 생성하게 됨

image image

PR 메시지 작성 시 브랜치에서 어떤 기능을 추가/수정 했는지 자세하게 쓰면 좋음

Merge Pull Request

Pull Request를 받은 원본 저장소 관리자는 코드 변경내용 확인하고 Merge 여부 결정 관리자가 승인 하면 Merge Confirm으로 원본 저장소에 변경된 사항이 반영되고 , Pull request 상태는 close로 변경됨 관리자 미승인시 Reject 됨

Merge 이후 동기화 및 Branch 삭제

# 코드 동기화
$ git pull JaehyoJJang # 원본 remote와 동기화
 
# Branch 삭제
$ git branch -d dev

Loading script...