# Pull Request

## Pull Request(PR)

Pull Request(이후 PR)는 작업이 완료된 브랜치를 다른 브랜치에 병합할 것을 요청하는 작업이다. 프로젝트 설정을 통해 main 브랜치에는 직접적인 업로드가 이루어지지 않도록 설정되어 있으므로 PR을 생성해야  병합이 가능하다.

## PR 전 확인할 사항

PR을 생성할 때 **현재 브랜치의 작업내역이 병합 가능할 수도, 불가능할 수도 있다**는 사실을 알아야 한다. 여러 팀원들이 동시에 작업을 진행하기 때문에 main 브랜치에 내 브랜치와 충돌되는 내용이 있을 수 있으므로 이를 해결한 뒤 PR을 생성하는 것이 바람직하다.

<div align="left"><figure><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2Fj6rdjFBgTtFtiwtJRAWX%2Fimage.png?alt=media&#x26;token=ec013785-4e68-48b1-988d-54471b3e4e08" alt=""><figcaption></figcaption></figure></div>

위와 같은 상황일 경우 hacademy와 fieryteacher의 작업 내용이 겹치는 부분이 있다면 나중에 PR을 생성하는 브랜치는 병합이 불가능하다.

## PR 생성에 문제가 없는 경우

fieryteacher 에서 PR 생성을 진행해본다.

<div align="left"><figure><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2FEa5XIH27EqSvKWtLNl5h%2FPR-1.gif?alt=media&#x26;token=c41873fc-cb3d-4783-a891-2d1719e47e24" alt=""><figcaption></figcaption></figure></div>

현재 아무도 작업을 올리지 않았기 때문에 충돌이 발생할 일이 없어 바로 병합(merge)이 가능하다.

## PR 생성 시 문제가 발생하는 경우

이어서 hacademy 브랜치에 대해 PR을 생성하면 <mark style="color:red;">**Can't automatically merge**</mark> 라는 메세지가 뜨면서 병합이 되지 않는다. 이는 현재 main 브랜치의 내용 중 hacademy 브랜치와 충돌하는 내용이 있기 때문이다.

{% hint style="info" %}
의도적으로 충돌 상황을 만들기 위해 <mark style="color:blue;">`HomeController`</mark> 클래스를 각각 다른 내용으로 만들었다.
{% endhint %}

<div align="left"><figure><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2F6X6cQFQ9DOZEa0VHNbUr%2Fpr-deny.gif?alt=media&#x26;token=46859461-cbc0-4dbd-9087-1d4569e28f5a" alt=""><figcaption></figcaption></figure></div>

## 충돌 해결

PR 생성을 위해서는 충돌(Conflict)을 해결해야 한다. 웹에서도 어느 정도 해결이 가능하지만 이클립스에서 해결하는 방법에 대해서 살펴본다. 진행 순서는 다음과 같다.

1. 현재 작업 내역을 모두 commit한다. (프로젝트 혹은 저장소에 <mark style="color:red;">**`>`**</mark> 표시가 있을 경우)
2. 원격 저장소에서 <mark style="color:red;">**fetch**</mark> 또는 <mark style="color:red;">**pull**</mark> 작업을 수행하여 변경 사항을 내려받는다.
3. Remote Tracking의 `origin/main` 브랜치와 <mark style="color:red;">**merge**</mark>를 수행한다.
4. 충돌 발생 지점을 찾아 문제를 해결한다.
5. 작업 내역을 <mark style="color:red;">**commit and push**</mark> 한다.
6. PR 생성 후 병합한다.

<div align="left"><figure><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2FVaRvhvWRkWPxZJYLwAtj%2F1.commit.gif?alt=media&#x26;token=dd8e0d2f-b67e-48b1-9f03-67b5eeafe5d4" alt=""><figcaption><p>현재 작업 내역을 모두 commit한다</p></figcaption></figure></div>

<figure><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2FeAuTHRDEq1DLEgM3gSAl%2F2.pull.gif?alt=media&#x26;token=455f4a13-888a-4082-9d4f-074d9ff39a68" alt=""><figcaption><p>원격 저장소에서 <mark style="color:red;"><strong>fetch</strong></mark> 또는 <mark style="color:red;"><strong>pull</strong></mark> 작업을 수행하여 변경 사항을 내려받는다</p></figcaption></figure>

<div align="left"><figure><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2FSULNdfqz0EHOHUnEVvSv%2F3.merge.gif?alt=media&#x26;token=6d799fd6-5294-4860-835a-0211eb9ec85b" alt=""><figcaption><p>Remote Tracking의 <code>origin/main</code> 브랜치와 <mark style="color:red;"><strong>merge</strong></mark>를 수행한다</p></figcaption></figure></div>

<figure><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2FwphzgRS1aKoBDOcy7h2O%2F4.conflict-resolve.gif?alt=media&#x26;token=aaf777c7-1d57-412f-b649-94af9a77d9c6" alt=""><figcaption><p>충돌 발생 지점을 찾아 문제를 해결한다</p></figcaption></figure>

<div align="left"><figure><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2FMAbm6wZ8RDxtTTp5ZWFE%2F5.commit%20and%20push.gif?alt=media&#x26;token=51d3c36a-65f6-44b9-9cec-0d067e254feb" alt=""><figcaption><p>작업 내역을 <mark style="color:red;"><strong>commit and push</strong></mark> 한다</p></figcaption></figure></div>

충돌이 해결되어 PR 생성 직전의 상황은 다음과 같다. main 브랜치의 내용이 hacademy 브랜치로 합쳐졌음을 알 수 있다. 이후 PR 생성 시 문제가 발생하지 않는다.

<div align="left"><figure><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2FfE6fCOFJv2SxyXlqrEHU%2Fimage.png?alt=media&#x26;token=d4ab4608-614c-4573-bb44-1c188ee3eae2" alt=""><figcaption></figcaption></figure></div>

{% hint style="info" %}
충돌을 해결하는 사이 다른 사람이 PR 생성 후 병합하였다면 다시 처음부터 진행해야 할 수도 있다.
{% endhint %}

## 문제 해결 후 PR 생성

문제를 해결한 뒤 PR 생성 시 정상적으로 병합이 완료된다.

<div align="left"><figure><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2FM23l2nR0EiICzx5WGbaa%2F6.PR.gif?alt=media&#x26;token=61bf7d67-2e46-438f-9916-ea1eb8732f6a" alt=""><figcaption></figcaption></figure></div>

## 브랜치 삭제

PR 후 병합까지 성공한 경우 브랜치는 삭제하는 것이 좋다. 브랜치는 작업 트랜잭션 단위로 새로 만들어서 사용하는 것이 좋다.
