Skip to content

HowTo | PR

ML-TANGO edited this page Aug 31, 2023 · 10 revisions

How to PR (Pull Request)

TL;DR

For protection of main branch, Please use Github PR function instead of git command line explained below

main 브랜치의 보호를 위하여 아래의 설명한 명령행 대신에, Github에서 제공하는 PR을 사용하시기 바랍니다.

#---------------------------------------------------------------
# 1. Synch your local 'main' branch with current remote 'main' branch
#---------------------------------------------------------------
$ git checkout main
$ git pull

# resolve conflicts if any.

$ git add
$ git commit

#---------------------------------------------------------------
# 2. Synch your local 'feature' branch with current local 'main' branch
#---------------------------------------------------------------
$ git checkout <your_feature_branch>
$ git merge main

# resolve conflicts if it any.

$ git add 
$ git commit
$ git push

#---------------------------------------------------------------
# 4. Synch your current local 'main' branch with your current local 'feature' branch
#---------------------------------------------------------------
$ git checkout main
$ git merge  <your_feature_branch>

# resolve conflicts if any.

$ git add
$ git commit

#---------------------------------------------------------------
# 5. Synch current remote 'main' branch with your current local 'main' branch
#---------------------------------------------------------------
$ git push
  • I use current adjective to emphasize that other developers might make changes and commit to other/same remote/local branch on which your are working on.
  • Remember that there might be concurrent commit/push among developers. Hence, you should always check the current contents of the branch is up-to-date or not.

References:

GitHub에 자신의 로컬브랜치(e.g., etri_feature01)에서 작업한 결과물을 PR하기까지의 과정을 설명합니다.

실습이 필요한 경우, 본 프로젝트를 fork하여 자신의 GitHub 계정에 원격 저장소를 만들고, fork된 원격 저장소를 clone하여 아래의 내용을 실습하시면 본 프로젝트의 GitHub 저장소에 영향을 주지 않고 실습하실 수 있습니다. 실습을 위하여 Fork한 자신의 원격 저장소에서 오리지널 원격 저장소와는 Sync를 하시지 마시지 바랍니다.


용어 설명

References:

본 문서에서 사용하는 용어들에 대하여 아래와 같이 정의한다.

  • 원격 저장소(Remote Repo, Origin, Upstream등로 불림): https://github.com/ML-TANGO/TANGO 와 같이 협업을 위하여 공동으로 사용하는 GitHub 저장소
  • 로컬 저장소(Local Repo): 자신의 PC 또는 서버에 만든 작업용 개인 git 저장소
    • 일반적으로 원격 저장소를 git clone을 통하여 복제후 사용한다.
  • 브랜치(Branch): 특정 작업(릴리즈 관리, 디버그, 기능 추가, 기능 개선)을 위하여 생성하는 작업 흐름
    • main 브랜치: 기본 브랜치로 항상 빌드 가능하고 실행 가능한 코드를 유지하기 위한 브랜치
    • feature 브랜치: 특정 장업을 위하여 main 브랜치에 영향을 주지않고 개발하기 위한 브랜치
    • 원격 브랜치: 원격 저장소의 브랜치
    • 로컬 브랜치: 로컬 저장소의 브랜치

PR (Pull Request) 절차

PR은 개발자가 자신의 브랜치에서 개발하고 검증한 코드들을 원격 저장소의 main 브랜치에 반영(pull)해달라고 요청(request) 하는 것으로, 개발자 입장에서 PR의 전체 과정은 다음과 같이 진행된다.

1. 원격 저장소의 내용을 로컬 저장소로 가져오기

로컬 저장소가 없을 경우: git clone을 통하여 원격 저장소를 로컬 저장소로 복제

$ git clone git@github.com:ML-TANGO/TANGO.git

로컬 저장소가 이미 있는 경우: git pull origin main을 통하여 원격 저장소의 원격 브랜치를 설정

$ git pull origin main

2. 로컬저장소에서 자신만의 작업을 위한 로컬 브랜치 생성후 브랜치로 이동

# 작업용 로컬 브랜치(e.g., etri_featuer01)를 생성
$ git branch etri_featuer01

# 작업용 로컬 브랜치(e.g., etri_featuer01)로 전환
$ git checkout etri_featuer01

위의 두개의 명령들은 다음과 같은 하나의 명령으로도 가능하다.

# 작업용 로컬 브랜치(e.g., etri_featuer01) 생성후 바로 전환
$ git check out -b etri_featuer01

3. 작업용 로컬 브랜치에서 코드 수정 작성

현재 위치한 브랜치가 작업용 로컬 브랜치인지 확인한다.

# 현재 브랜치 확인
$ git branch
  main
* etri_featuer01
  • 출력결과에서 브랜치명 앞에 * 가 붙은 브랜치가 현재 브랜치임.

4. 작업용 로컬 브랜치의 작업 내용을 로컬 저장소에 커밋

현재 위치한 브랜치가 작업용 로컬 브랜치인지 확인한다.

# 현재 브랜치 확인
$ git branch
  main
* etri_featuer01
# Stage Area에 수정 파일 추가
$ git add .
sedan
# 작업 내용을 로컬 저장소에 커밋
$ git commit 

5. 로컬 저장소의 로컬 브랜치에서의 작업 내용을 원격 저장소에도 반영 push

원격 저장소에 로컬 작업용 브랜치가 존재하는 경우, 다음과 같은 명령을 통하여 원격 저장소에 push한다.

$ git push

원격 저장소에 로컬 작업용 브랜치가 존재하지 않는 경우, 다음과 같은 명령을 통하여 원격 저장소(e.g., orign)과 원격 브랜치(e.g., etri_feature01)를 지정하여 push한다.

$ git push origin etri_featuer01
  • 원격 저장소에 원격 브랜치가 있으면 해당 브랜치 안에서 git push를 하면 바로 원격 저장소의 브랜치에 내용을 push 할 수 있다.
  • 원격 저장소에 원격 브랜치가 없다면 git push만 했을 때, upstream이 없다는 오류가 나게 된다.
    • 원격 저장소에 브랜치 생성 후 브랜치 내용 push를 해줘야 한다.
    • 원격 브랜치의 이름은 혼돈을 주지 않도록, 가급적 로컬 브랜치와 동일한 이름을 사용한다.

6. 로컬 main 브랜치로 이동 후 원격 저장소의 원격 main 브랜치에 가해진 변경사항을 pull

로컬 저장소에서 작업용 로컬 브랜치를 생성해서 작업을 하는 동안 다른 협업자가 원격 저장소의 main 원격 브랜치에 자신이 추가한 커밋들에 대한 push를 진행해놓았을 수도 있다. 그러므로 로컬 저장소의 main 로컬 브랜치로 이동 후, 원격 저장소의 main 원격 브랜치의 내용을 pull하여 로컬 저장소의 main 로컬 브랜치를 업데이트 해주어야 한다.

# main 로컬 브랜치로 전환
$ git checkout main

# 원격 저장소의 main 원격 브랜치의 최신 내용을 로컬 저장소의 main 로컬 브랜치에 반영
$ git pull origin main

7. 로컬 저장소의 작업용 로컬 브랜치(e.g., etri_feature01)로 전환후 로컬 저장소의 main 로컬 브랜치의 내용을 작업 브랜치(e.g., etri_feature01)에 merge

# 로컬 작업 브랜치(e.g., etri_feature01)로 전환
$ git checkout etri_feature01)

# 로컬 저장소의 main 로컬 브랜치의 최신 내용을 로컬 저장소의 작업용 로컬 브랜치(e.g., etri_feature01)에 반영
$ git merge main

merge 과정에서 conflict(코드의 동일한 위치를 2명 이상이 동시에 수정하여, Git에 의한 자동 merge가 불가능한 상황)가 발생하는 경우, 해결해주어야 한다.

git merge, conflict등에 대한 개념 설명은 아래의 생활코딩 유튜브 영상을 참고

Conflict를 해결하고 나면, 로컬 저장소의 작업용 로컬 브랜치(e.g., etri_feature01)의 작업 결과를 원격 저장소의 원격 브랜치(e.g., etri_feature01)에 반영해준다.

# 작업 결과 원격 저장소 반영
$ git push

위의 과정을 통하여 main 로컬 브랜치를 merge한 작업용 로컬 브랜치(e.g., etri_feature01)의 내용이 원격 저장소의 작업 브랜치(e.g., etri_feature01)에 업데이트되었다.

8. github 홈페이지의 repository로 이동 후 pull request 요청을 하면 완료

GiHub의 원격 저장소로 이동후, 상단은 메뉴중 Pull requests 를 클릭후 해당 페이지에서 요청한다.

9. 담당자가 확인 후 pull request를 수락하면 원격 저장소 main 에 브랜치의 내용이 업데이트된다

PR후에 reviewer들이 PR 내용을 검토하고, 문제가 없다고 판단하면 해당 PR을 accept하지만, 우리과제에서는 PR 요청하신 분이 직접 PR을 accept 하시면 됩니다.

Clone this wiki locally