이번 글에서는 회사나 스터디 그룹 등 팀원들끼리 프로젝트를 진행하는데에 있어서 코드를 관리하는 방법에 대해서 설명하고자 한다.
그 방법은 GitHub의 Pull Request(풀 리퀘스트) 기능을 이용하는 것이다.
Pull Request가 무엇인지 한번 알아보자.

1. Pull Request(PR)란?
- 깃허브(GitHub)에서 Pull Request는 오픈 소스 프로젝트뿐만 아니라 개인 및 팀 프로젝트에서도 매우 중요한 협업 도구다.
- 소스 코드 변경 사항을 관리하고 협업하는 데 사용되며 , 다른 사용자가 저장소의 소스 코드를 수정하고 이 변경 사항을 병합할 수 있도록 요청할 때 사용한다 - (1)
- 또한 Pull Request는 코드를 병합하기 전에 변경 사항을 리뷰하고 토론 및 피드백을 할 수 있는 기회를 제공한다 - (2)
- 즉 , Pull Request는 개발자가 특정 브랜치에서 작업한 변경 사항을 기존 브랜치(주로 main이나 master 브랜치)에 병합(Merge)해 달라고 요청하는 절차이다 - (3)

2. Fork와 Clone의 차이
Fork라는 기능을 알게 된 후 문득 Fork와 Clone이 비슷한거 아닌가라는 생각이 들었다.
그래서 두 기능에 대해서 어떤 차이가 있는지 궁금해서 정리를 해보았다.
간단히 요약하자면 :
- Clone : 해당 프로젝트에 내가 팀원이라면 , 로컬 컴퓨터에 저장소를 복사하여 작업 진행. (로컬 개발 및 테스트)
- Fork : 해당 프로젝트에 팀원이 아니라면 , 자신의 GitHub 상에서 저장소를 복사하여 작업 진행. (협업 또는 오픈소스 기여)
Fork
Fork는 특정 GitHub 저장소(repository)의 복사본을 자신의 GitHub 계정으로 만드는 작업이다.
주요 목적 :
- 프로젝트 기여: 다른 사용자의 공개 저장소에 기여하고 싶을 때.
- 개인적인 변경: 다른 사람의 코드에 기반하여 개인적으로 사용하거나 수정하고 싶을 때.
- 원본 프로젝트를 보호: 메인 저장소를 안전하게 유지하면서 변경 사항을 테스트하고 싶을 때.
특징 :
- 원본 저장소와 복사된 내 로컬 저장소는 분리되어 있지만 , Fork 한 저장소(내 레포지토리)는 서로 연결되어 있다.
- 만약 원본 저장소에서 코드 변경 사항이 발생하면 Fetch나 Pull을 실행해서 업데이트가 가능하다.
- 코드의 변경 사항을 원본 저장소에 Pull Request를 통해 반영할 수 있다.
Clone
Clone은 로컬 컴퓨터에 GitHub 저장소의 복사본을 만드는 작업이다.
주요 목적 :
- 로컬 작업: 인터넷 연결 없이도 로컬 환경에서 저장소를 클론하여 작업이 가능하다.
- 변경 및 커밋: 로컬에서 코드를 수정하고 커밋을 만들며 , 나중에 이를 다시 푸시(pull)하여 원격 저장소에 반영할 수 있다.
특징:
- Clone 한 저장소는 로컬 컴퓨터에 위치하며, 푸시, 풀(pull) 등을 통해 원격 저장소(Remote)와 동기화할 수 있다.
- 원래의 GitHub 저장소와 연결되어 있으며, 브랜치 변경, 커밋, 푸시 등을 통해 원격 저장소와 상호작용할 수 있다.
- Clone 한 프로젝트는 원본 레포지토리의 로그를 볼 수 없다. 권한이 없는 경우, 내 로컬의 변경 사항을 원본 레포지토리로 push 또한 할 수 없다. (소규모 팀작업에서는 활용하기 좋다)
- 만약 협업 중 각각 Clone 한 프로젝트에서 변경 사항을 적용하고 싶을 때, 상대방이 먼저 push (권한이 있을 경우) 를 하게 되면, push 를 할 때 마다 fetch 를 수행한 후 push 를 해야한다는 번거로움이 있다.
Fork 와 Clone의 진행 프로세스
- Fork > Pull Request 요청
- Clone > Push 요청

Fork > Pull Request 진행 프로세스
- 내 원격 리포지토리(GitHub)에 Fork
- Clone > Local ComPuter에 저장
- remote 설정 후 > branch 생성
- 수정 작업 후 Add > Commit > Push (만일 원문 코드에서 소스를 수정했다면 Fetch로 코드를 가져와 충돌을 해결)
- Pull Request 생성
- 진행상황 이미지

3. Pull Request 하는 방법
(1) 리포지토리에서 브랜치 아이콘 클릭
- 브랜치 페이지 및 Pull requests 페이지에서도 가능하다.

(2) 브랜치 페이지에서 PR하고 싶은 브랜치의 더보기 클릭
- PR 시 브랜치 삭제도 가능하다. (브랜치 관리)

(3) New pull request 클릭
- 클릭 시 Master 브랜치 > 선택한 브랜치가 자동으로 매칭된다.

(4) 타이틀과 설명을 작성 후 Creat pull request 클릭
- 오른쪽에 리뷰어를 추가할 수 있다.

(5) 작업을 확인 후 문제가 없다면 Merge 진행.
- 만약 문제가 있다면 충돌이 발생하고 충돌이 일어난 코드들을 보여준다.


(6) 정상적으로 PR Merge 완료
- 합병된 브랜치는 관리적 차원에서 삭제 - Delete branch 클릭

4. PR 취소하는 방법 - Revert
(1) 해당 리포지토리의 Pull requests 클릭
- 메인 페이지에서 상단 카테고리 확인.

(2) Closed 클릭
- Closed를 클릭해도 되고 검색해서 찾아도 된다.

(3) 취소하고 싶은 PR을 클릭
- 취소하고 싶은 PR이 맞는지 다시 한번 확인.

(4) Revert 클릭
- 우측 하단 확인.

(5) 타이틀과 내용에 자동으로 Revert가 생성
- 문구 앞에 자동으로 Revert가 붙지만 따로 내용수정이 가능하다.

(6) Revert 완료
- 문제없이 완료 되었으면 코드가 Merge 전으로 되돌아간걸 확인한다.
