카테고리 없음

Git PR 관리

ㅈ현 2022. 6. 30. 22:34

PR이란?

Pull Request란 내가 변경한 내용을 다른 브랜치로 머지하고자 할때, “내 변경을 받아주세요” 와 같은 요청이다.

PR 생성

PR은 github Pull Request 탭에서 생성할 수 있으며, 생성시 ID가 붙게 된다.

Pull Request의 ID는 #4다

PR Merge

생성된 PR은 타겟 브랜치로 머지할 수 있게 되는데, 이때 변경된 내용에 따라 다음과 같은 상황이 일어나게 된다.

1. 자동 Merge 

첫번째 시나리오로써 내가 변경한 내용과, Merge 하려는 타겟 브랜치와 충돌이 없거나, 자동으로 해결 가능한 충돌일때는 자동으로 merge가 된다. 이때는 PR에서 바로 Merge할 수 있는 버튼이 나타나게 된다. 

활성화된 Merge 버튼

 

이때는 Merge Pull Request를 눌러 Target Branch로 머지가 가능하다. 

병합된 두개의 branch

 

2. 수동 Merge 

하지만 항상 자동으로 머지가 되지는 않는다. 때로는 변경사항과 타겟 브랜치간에 자동으로 머지할 수 없을정도의(동시에 같은 부분 수정) 충돌이 일어나게 된다면 이때는 PR을 만들때 다음과 같은 경고가 뜨게 된다. 

자동으로 머지가 되지 않는다는 경고


이때는 충돌 내용에 대해 직접 손으로 수정해주어야 한다.

2.1 수동 Merge 과정 

auto merge가 이루어지지 않는다면 PR에서의 Merge는 아래 과정을 거치게 된다.
(PR을 생성한 브랜치를 source, PR이 병합될 브랜치를 target이라 표현)

  1. source => target으로 PR 생성
  2. source, target간 conflict 해결
  3. conflict를 해결한 merge commit이 source branch에 생성
  4. 3.에서 생성된 commit을 target branch로 merge

다음과 같이 master, branch2 두개의 브랜치를 branch2 => master로 가는 PR을 생성 후 Merge하려 하고, 둘간에는 auto merge가 이루어지지 않는 상황이다. 

두개의 branch

 

branch2 master 간 충돌때문에 auto merge가 이루어지지 않아 수작업으로 충돌을 해결해 주게 된다면 아래 그림과 같이 branch2브랜치에 master => branch2 로 merge가 되는 새로운 commit이 생성되게 된다.

master => branch2로 머지

 

PR을 넣은 branch에서 target과 병합한 새로운 커밋이 생성되게 된다.

이제 이상태에서 PR을 Merge 해주게 된다면 아래 그림과 같이 master 브랜치로 머지가 되게 되고 PR이 닫히게 된다.

master로 머지된 PR

 

2.2 수동 Merge (web editor) 

PR에서의 충돌의 수준이 작다면 github의 web editor를 통해 충돌 해결이 가능하다.
PR을 열게된다면 아래 그림과 같이 confirm merge 대신 resolve conflicts 버튼이 나오게 된다.

web editor를 통해 충돌을 수정 버튼 활성화

 

web editor를 켜서 충돌 부위를 확인하게 되면, 다음과 같이 나오게 된다.

web editor

 

충돌 부위를 모두 해결한 다음 commit merge를 누르게 되면 새로운 merge commit이 생성되게 된다.

commit merge

 

이후 conflict merge를 통해 PR을 target branch로 Merge하면 된다.

confirm merge여기까지 하면 web editor를 통한 수동 Merge가 완료다.

2.3 수동 Merge (CLI) 

하지만 web editor에서 수정할 수 없는 수준의 충돌이게 된다면, 커멘드 라인을 통해 머지하라는 문구가 나오게 되며 resolve conflicts버튼이 비활성화 된다. 

비활성화된 resolve conflicts

 

이때는 커맨드 라인을 통해 수정을 해야 한다. 경고창에 뜬 command line을 누르게 된다면 다음과 같이 PR을 머지하는데 필요한 커맨드가 나오게 된다.

충돌 해결 command

 

step1 

  1. remote 데이터를 fetch해라
  2. remote에 있는 branch2라는 브랜치로 체크아웃 해라
    • 여기서 만약 로컬에 branch2라는 브랜치가 있다면 해당 명령이 아닌 git checkout branch2를 통해 체크아웃 함.
    • 여기서 나온 명령은 로컬에 branch2라는 브랜치가 없다는 가정하에 필요한 명령
  3. master와 머지한다.

여기까지 진행 후 충돌을 직접 해결한다.
충돌이 해결된 후

step2 

  1. 마스터로 checkout 해라
  2. branch2 와 non fast forward 머지를 실행해라
  3. 머지한 내용을 origin master로 push해라

다음과 같은 과정을 거치게 된다.