풀 리퀘스트, Pull & Fetch

Violet_Evgadn·2023년 9월 6일
0

Git

목록 보기
16/33

Pull Request

Pull Request란?

우리는 이제 명령어나 IntelliJ를 활용해 브랜치를 언제든 생성하고, 통합시킬 수 있다.
하지만 지금까지는 "로컬 저장소"에서의 작업만 수행했다.

결국 여러 개발자와의 협업을 위해 "git"이라는 툴을 활용하기 위해선 원격 저장소를 잘 활용해야 할 필요가 있다.

그런데 이 원격 저장소에서는 내 마음대로 작업을 해서는 안 된다.
왜냐하면 원격 저장소는 협업하는 모든 사용자가 동시에 사용하는 공간이기 때문이다.

예를 들어 개발자 A가 branch A에 작업을 수행한 뒤 원격 저장소에 Push 했다고 가정하자.
그런데 개발자 B가 branch A를 맘대로 삭제시켜버리거나 아직 완성되지 않은 branch A 작업물을 main 브랜치에 머지 시켜버리면 안 될 것이다.

따라서 개발자는 원격 저장소에서 작업을 수행할 때 다른 협업자에게 작업 수행 여부 및 작업 내용을 알릴 필요가 있으며 특히 브랜치 병합(Merge)을 수행할 땐 필수적으로 다른 협업자에게 이를 알려야 한다.

풀 리퀘스트(Pull Request)는 다른 협업자에게 원격 저장소 브랜치 병합을 수행하겠다 알리는 메시지를 보내는 작업이다.

이러한 원격 저장소의 작업은 원격 저장소에서만 수행할 수 있다.
아마 대부분은 Github나 Bitbucket 같은 소스코드 호스팅 사이트를 사용할 것이므로 Github나 Bitbucket에 가야지만 Pull Request를 수행할 수 있을 것이다.

풀(Pull) & 패치(Fetch)

풀 리퀘스트(Pull Request)는 원격 저장소에서 2개의 브랜치를 합치는 과정이라고 요약할 수 있을 것이다.
그런데 2개의 브랜치를 합치는 과정에서 "충돌(Conflict)"가 발생할 수 있다.

로컬 저장소에서 충돌이 발생하지 않는다면 원격 저장소에서도 충돌이 발생하지 않을 것이고, 원격 저장소에서의 충돌 해결은 로컬 저장소에서 IntelliJ나 VSCode 등의 툴을 활용하는 방법보다 어렵기 때문에 무조건 로컬에서 정상적으로 병합(Merge)가 되는지 확인한 뒤 작업물을 원격 저장소에 Push 하는 것이 좋다.

그리고, 이 과정에서 필수적으로 수행해야 하는 것이 Pull과 Fetch이다.

풀(Pull)은 원격 저장소에 있는 코드를 내려받는 과정이고 패치(Fetch)는 Git log와 그래프(업데이트 이력)을 최신화하는 과정이다.

IntelliJ 같은 툴에서는 일정 시간이 지나면 자동으로 git Fetch를 진행하긴 하지만 Git push 이전 무조건 수행하는 것이 좋다.

특히, git pull 과정은 무조건 거쳐야 한다.

내가 작업을 하고 있는 과정에도 여러 협업자들은 각자의 작업을 하였고, 이를 다른 브랜치에 병합(Merge) 시켰을 것이다.
그리고 내가 병합하고 싶은 main 브랜치develop 브랜치에도 자신의 작업 내용을 반영했을 수도 있다.

따라서 충돌을 로컬 저장소에서 모두 해결한 뒤 원격 저장소에 Push하기 위해선 먼저 원격 저장소의 코드를 git pull을 통해 최신화한 뒤 커밋 및 Push를 진행해야 한다.


IntelliJ에서의 Pull Request

0. 원격 저장소와 로컬 저장소 동기화시키기

git push를 수행해도 되고 동기화가 어려우면 로컬 저장소를 새로 만들어 Github 작업물을 받아오자.

1. 새로운 브랜치 생성 & 파일 수정 후 커밋

2. Github에서 원격 저장소 파일 수정 & 커밋

충돌이 발생하도록 1번에서 수정한 파일과 같은 파일을 수정하는 것을 추천한다.
(그래야 실습이 더욱 와닿는다)

3. main 브랜치 이동(checkout) & Pull 받기

우리는 main 브랜치에 우리의 작업물을 반영하고 싶다.
따라서 main 브랜치로 checkout 한 뒤 git pull을 통해 원격 저장소 파일로 로컬 저장소의 파일을 최신화하자.

4. Pull 받기

Pull 버튼을 누른 뒤 오른쪽 아래에 빨간색 글씨가 없다면 성공적으로 원격 저장소 작업물을 로컬 저장소에 가지고 온 것이다.

5. 로컬 저장소에서 Merge 해보기

우리가 Push할 작업물은 1번 과정에서 생성한 pull_request_branch 브랜치에 존재한다.
즉, 우리는 pull_requeste_branch 브랜치에서 원격 저장소로 Push 작업을 진행할 것이다.

이런 점을 고려했을 때 충돌 해결을 위해선 pull_request_branch 브랜치로 이동(checkout) 한 뒤 main 브랜치에 대해 Merge(병합) 요청을 수행하자.

만약 과정을 잘 따라왔다면 위와 같이 Conflict 해결 팝업 창이 떴을 것이고, 이전 Section처럼 충돌을 해결하면 된다.

6. Git Push

Git > Push를 클릭하면 아래와 같은 팝업 창이 뜬다.

만약 작업물을 Push할 원격 저장소 Branch를 변경하고 싶다면 origin 옆에 있는 "pull_request_branch"을 클릭해 보자.

그럼 원격 저장소 브랜치 글씨가 입력 가능한 입력창으로 바뀐다.
이 때 원하는 원격 브랜치 명으로 수정하면 된다.

지금은 pull_request_branch 브랜치에 Push할 것이므로 수정하지 않고 바로 Push 버튼을 누르자.

7. Github 접속 & Pull Requests 선택

첫 번째 이미지의 빨간색 네모 중 하나를 클릭하면 Pull Request를 생성할 수 있다.
만약 위쪽 Pull Requests 버튼을 클릭했다면 2번째 이미지에서 빨간색 네모 안에 있는 New Pull request 버튼을 클릭하여 Pull Requests를 생성할 수 있다.

8. Pull Requests 생성 창 & Pull Request 창

2개 창에 대해선 다음 Section에서 자세히 알아보자.
일단 지금은 이런 창이 생성된다는 것 정도만 알고 넘어가자.

첫 번째 이미지에서 Create pull request 버튼을 누르면 두 번째 이미지의 창이 뜨고, 여기서 Merge pull request 버튼을 누르면 Confirm merge 버튼으로 바뀐다.
Confirm merge 버튼을 누르면 원격 저장소에서 pull_request_branch 브랜치main 브랜치에 병합시킬 수 있다.

Confirm merge 버튼을 누르면 위 이미지와 같은 창이 뜰 텐데 이는 원격 저장소에서 pull_request_branch 브랜치를 삭제할지 물어보는 것이다.
더 이상 원격 저장소에서 해당 브랜치를 사용할 것 같지 않다면 Delete branch 버튼을 클릭하여 브랜치를 삭제하자.

9. 상태 확인

main 브랜치에 정상적으로 작업물이 반영되었음을 볼 수 있다.

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글