풀 리퀘스트 플로우


자신의 브랜치에서 기능 작업을 완료했습니다. 프로젝트는 공유 중입니다: 다른 사람들도 커밋합니다. 따라서 main에 직접 푸시해서 운을 바라지는 않습니다. 변경 사항을 검토받고, 필요하면 논의하고, 팀 전체가 볼 수 있는 방식으로 머지하길 원합니다. 자신의 머신의 브랜치에서 코드가 main에 적용되는 전체 경로가 바로 풀 리퀘스트 플로우이며, 이는 GitHub의 거의 모든 팀이 변경 사항을 적용하는 방식입니다. Git 측면에서는 이전 장의 명령어들만 사용합니다: 브랜치, 커밋, 푸시:
$ git switch -c add-five-day-forecast
Switched to a new branch 'add-five-day-forecast'
$ git add src/forecast.js
$ git commit -m "5일 예보 패널 추가"
$ git push -u origin add-five-day-forecast
Branch 'add-five-day-forecast' set up to track 'origin/add-five-day-forecast'.이 푸시는 브랜치를 GitHub로 보냅니다. 아직 머지되지 않았고, 검토를 위해 제안조차 되지 않았습니다. 다음 단계인 풀 리퀘스트 오픈은 GitHub 웹사이트에서 이루어집니다.
풀 리퀘스트를 오픈할 때 일어나는 일
GitHub에서 위와 같은 푸시 후, 새 브랜치를 main과 비교하는 것을 제안하는 배너가 표시됩니다. 이를 클릭하고 제목과 변경 사항 및 이유에 대한 짧은 설명을 작성한 후 페이지를 오픈합니다. 이 페이지가 바로 **풀 리퀘스트**이며, 종종 PR로 약칭됩니다: 한 브랜치를 다른 브랜치로 머지하는 요청이며, 이에 붙어 있는 지속적인 대화입니다.
풀 리퀘스트는 머지를 제안하고 승인을 기다립니다. 누군가 (당신일 수도, 팀 동료일 수도) 변경 사항을 읽고, 의견을 남기고, 문제없어 보일 때만 머지합니다. 그때까지 브랜치와 main은 페이지를 오픈하기 전과 정확히 같은 상태입니다.
포크 vs 브랜치
저장소에 대한 쓰기 액세스 권한이 있을 때 브랜치에서 풀 리퀘스트를 오픈하는 것이 작동합니다. 이는 자신의 팀 프로젝트에서 정상적인 경우입니다. 쓰기 액세스 권한이 없는 프로젝트에 기여하려면 추가 단계가 필요합니다: 포크, 자신의 GitHub 계정 아래의 저장소 자신의 복사본입니다.
포크 내에서 정확히 소유한 프로젝트에서 했을 것처럼 브랜치를 만들고 커밋하고, 포크로 푸시한 다음, 포크의 브랜치에서 원본 저장소로 풀 리퀘스트를 오픈합니다. GitHub는 한 저장소 내의 두 브랜치를 비교하는 것과 동일한 방식으로 두 저장소를 비교하므로, 검토 및 머지 플로우는 어느 쪽이든 동일하게 보입니다.
풀 리퀘스트 리뷰 진행하기
PR이 오픈되면, diff에 대한 진행 중인 대화가 되어집니다. 리뷰어가 변경 사항을 읽고, 특정 줄에 의견을 남기고, 승인하거나 변경을 요청합니다. 변경이 요청될 때, 같은 브랜치로 계속 커밋하고 푸시하세요: 모든 푸시가 새로운 것을 만드는 대신 같은 PR을 업데이트합니다. 리뷰어가 승인하고 필요한 모든 확인이 통과되면, PR은 머지할 준비가 되어 있습니다.
풀 리퀘스트가 머지되지 않는 이유
때로는 PR의 머지 버튼이 회색으로 표시되고, GitHub는 그 대신 메시지를 표시합니다: "이 브랜치에는 해결해야 할 충돌이 있습니다" 또는 "이 브랜치는 기본 브랜치와 비교하여 오래되었습니다." 두 메시지 모두 정상적이고 고칠 수 있는 상태를 설명합니다: main은 브랜치 이후로 진행되었습니다. 보통 다른 누군가의 PR이 그 사이에 머지되었기 때문이며, 브랜치는 GitHub가 둘을 깔끔하게 결합할 수 있기 전에 따라가야 합니다. 하나 이상의 기여자가 있는 모든 프로젝트에서 이런 일이 발생하므로, 이를 두려워하기보다는 예상하세요.
로컬에서 두 브랜치를 함께 가져오는 것과 동일한 방식으로 고치세요:
$ git switch add-five-day-forecast
$ git fetch origin
From github.com:김민준/weather-app
9f8e7d6..b7c9e21 main -> origin/main
$ git merge origin/main아무것도 겹치지 않으면 머지가 자체적으로 완료되고 푸시하면, PR이 업데이트되고 버튼이 잠금 해제됩니다. 같은 줄이 양쪽에서 변경되면, Git이 충돌을 파일에 표시하여 정확히 머징 및 충돌에서 다루어진 대로 해결합니다: 파일을 열고, 충돌 마커를 편집하여 원하는 결과로 만든 다음, git add와 git commit으로 머지를 완료하고 다시 푸시합니다.
막힌 풀 리퀘스트는 따라가거나 충돌을 해결해야 합니다.
main 뒤에 있거나 충돌이 있다는 의미입니다. 아무것도 깨진 게 아닙니다. 브랜치로 전환하고, 페치하고, main을 머지하여 충돌이 있으면 다른 곳에서처럼 해결한 후 다시 푸시하세요. 풀 리퀘스트가 무엇인지, 내부적으로
풀 리퀘스트는 Git 객체가 아니며, 풀 리퀘스트를 만드는 git 명령어는 없습니다. Git과 GitHub는 같은 것이 아닙니다: Git은 커밋, 브랜치, 그리고 다른 참조만 알고 있습니다 (참조는 커밋을 가리키는 이름입니다). GitHub는 비교하는 두 개의 참조 위에 전체 PR 페이지, 의견, 그리고 머지 버튼을 구축합니다: 브랜치 (헤드) 와 머지하려는 브랜치 (기본, 보통 main). 이 비교가 바로 GitHub의 웹사이트에서 (또는 GitHub 자신의 명령줄 도구나 API를 통해) 풀 리퀘스트를 오픈하는 이유이며, 순수 git 명령어로는 절대 하지 않는 이유입니다.

