우리는 이제 명령어나 IntelliJ를 활용해 브랜치를 언제든 생성하고, 통합시킬 수 있다.
하지만 지금까지는 "로컬 저장소"에서의 작업만 수행했다.
결국 여러 개발자와의 협업을 위해 "git"이라는 툴을 활용하기 위해선 원격 저장소를 잘 활용해야 할 필요가 있다.
그런데 이 원격 저장소에서는 내 마음대로 작업을 해서는 안 된다.
왜냐하면 원격 저장소는 협업하는 모든 사용자가 동시에 사용하는 공간이기 때문이다.
예를 들어 개발자 A가 branch A에 작업을 수행한 뒤 원격 저장소에 Push 했다고 가정하자.
그런데 개발자 B가 branch A를 맘대로 삭제시켜버리거나 아직 완성되지 않은 branch A 작업물을 main 브랜치에 머지 시켜버리면 안 될 것이다.
따라서 개발자는 원격 저장소에서 작업을 수행할 때 다른 협업자에게 작업 수행 여부 및 작업 내용을 알릴 필요가 있으며 특히 브랜치 병합(Merge)을 수행할 땐 필수적으로 다른 협업자에게 이를 알려야 한다.
풀 리퀘스트(Pull Request)는 다른 협업자에게 원격 저장소 브랜치 병합을 수행하겠다 알리는 메시지를 보내는 작업이다.
이러한 원격 저장소의 작업은 원격 저장소에서만 수행할 수 있다.
아마 대부분은 Github나 Bitbucket 같은 소스코드 호스팅 사이트를 사용할 것이므로 Github나 Bitbucket에 가야지만 Pull Request를 수행할 수 있을 것이다.
풀 리퀘스트(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를 진행해야 한다.
git push
를 수행해도 되고 동기화가 어려우면 로컬 저장소를 새로 만들어 Github 작업물을 받아오자.
충돌이 발생하도록 1번에서 수정한 파일과 같은 파일을 수정하는 것을 추천한다.
(그래야 실습이 더욱 와닿는다)
checkout
) & Pull 받기우리는 main 브랜치에 우리의 작업물을 반영하고 싶다.
따라서 main 브랜치로 checkout
한 뒤 git pull
을 통해 원격 저장소 파일로 로컬 저장소의 파일을 최신화하자.
Pull
버튼을 누른 뒤 오른쪽 아래에 빨간색 글씨가 없다면 성공적으로 원격 저장소 작업물을 로컬 저장소에 가지고 온 것이다.
우리가 Push할 작업물은 1번 과정에서 생성한 pull_request_branch 브랜치
에 존재한다.
즉, 우리는 pull_requeste_branch 브랜치
에서 원격 저장소로 Push 작업을 진행할 것이다.
이런 점을 고려했을 때 충돌 해결을 위해선 pull_request_branch 브랜치
로 이동(checkout
) 한 뒤 main 브랜치
에 대해 Merge(병합) 요청을 수행하자.
만약 과정을 잘 따라왔다면 위와 같이 Conflict 해결 팝업 창이 떴을 것이고, 이전 Section처럼 충돌을 해결하면 된다.
Git > Push를 클릭하면 아래와 같은 팝업 창이 뜬다.
만약 작업물을 Push할 원격 저장소 Branch를 변경하고 싶다면 origin 옆에 있는 "pull_request_branch"을 클릭해 보자.
그럼 원격 저장소 브랜치 글씨가 입력 가능한 입력창으로 바뀐다.
이 때 원하는 원격 브랜치 명으로 수정하면 된다.
지금은 pull_request_branch 브랜치
에 Push할 것이므로 수정하지 않고 바로 Push 버튼을 누르자.
첫 번째 이미지의 빨간색 네모 중 하나를 클릭하면 Pull Request를 생성할 수 있다.
만약 위쪽 Pull Requests 버튼을 클릭했다면 2번째 이미지에서 빨간색 네모 안에 있는 New Pull request
버튼을 클릭하여 Pull Requests를 생성할 수 있다.
2개 창에 대해선 다음 Section에서 자세히 알아보자.
일단 지금은 이런 창이 생성된다는 것 정도만 알고 넘어가자.
첫 번째 이미지에서 Create pull request
버튼을 누르면 두 번째 이미지의 창이 뜨고, 여기서 Merge pull request
버튼을 누르면 Confirm merge
버튼으로 바뀐다.
Confirm merge
버튼을 누르면 원격 저장소에서 pull_request_branch 브랜치
를 main 브랜치
에 병합시킬 수 있다.
Confirm merge
버튼을 누르면 위 이미지와 같은 창이 뜰 텐데 이는 원격 저장소에서 pull_request_branch 브랜치
를 삭제할지 물어보는 것이다.
더 이상 원격 저장소에서 해당 브랜치를 사용할 것 같지 않다면 Delete branch
버튼을 클릭하여 브랜치를 삭제하자.
main 브랜치에 정상적으로 작업물이 반영되었음을 볼 수 있다.