Git Fork란 원격 저장소를 복사하여 새로운 원격 저장소를 생성하는 작업을 말한다.
그렇다면 왜 Fork가 필요할까?
Git의 등장으로 시/공간에 관계없는 협업이 강화되었고 덕분에 "오픈 소스 프로젝트"가 매우 발전했다.
그런데 이 오픈 소스 프로젝트의 원본 저장소(Github) 소유자 입장에선 협력자가 많아질수록 저장소 관리가 어려워진다는 단점이 존재했다.
오픈 소스 프로젝트를 공부하거나 Contributor로써 기여하고 싶을 때 오픈 소스 프로젝트에 직접 Branch를 생성하고 작업물을 push 하기엔 위험성이 존재하기 때문이다.
만약 오픈 소스 프로젝트에 대한 작업을 수행하는 모든 개발자가 각자의 브랜치를 생성하고 작업해버린다면 관리해야 할 브랜치가 너무 많아지며 심지어 관리자가 모르는 Pull Request가 발생하여 관리자가 추적하지 못한 기능들이 추가, 변경 혹은 삭제될 위험성도 존재한다.
이런 위험성을 줄이기 위해 활용하는 것이 git fork
이다.
fork를 활용하면 다른 계정의 원격 저장소를 나의 Github 계정 원격 저장소로 복사해 가지고 올 수 있다.
이후 나의 원격 저장소에서 작업을 수행한다면 실수로 기존 오픈 소스 코드를 날리거나 훼손시키더라도 다시 복구할 수 있고 복구가 안될 것 같으면 다시 오픈 소스 프로젝트를 Fork 하면 된다.
또한 원격 저장소에서의 작업이 완료되었다면 Pull Request 요청을 다른 계정의 원격 저장소(오픈 소스 프로젝트 원격 저장소)에 날림으로써 프로젝트 관리자가 프로젝트를 관리하기가 더욱 수월해진다.
명령 | 의의 | 장점 | 단점 |
---|---|---|---|
브랜치 | 하나의 원격 저장소에 여러 개의 분기를 나눔 | 하나의 원본 저장소에서 커밋 이력 파악이 쉽게 가능 | 다수의 사용자가 협업할 시 위험성 증가 |
포크 | 원격 저장소 한 개를 통째로 다른 원격 저장소에 복사 | 원본 저장소에 영향을 미치지 않으므로 안전한 협업 가능 | 원본 저장소의 이력을 보려면 따로 주소를 추가해야 함 |
이전 Section 중 "원격 저장소에서 내려받기"에서 Clone에 대해 배운 적이 있다.
Clone과 Fork는 비교할 수도 없을 만큼 다른 작업이다.
Fork는 다른 원격 저장소 -> 나의 원격 저장소
로 코드를 가져오는 작업이며 Clone은 원격 저장소 -> 나의 컴퓨터
로 코드를 가져온 뒤 해당 파일을 로컬 저장소로 만드는 작업이기 때문이다.
단지 clone
과 fork
를 동시에 묶은 것은 이 둘이 합쳐져 하나의 흐름을 만들기 때문이다.
내가 오픈 소스 프로젝트에 대한 작업을 수행하고 싶을 경우 일단 fork
를 통해 나의 Github 원격 저장소로 프로젝트를 가지고 올 것이다.
이후 clone
을 통해 나의 원격 저장소에 저장되어 있는 오픈 소스 프로젝트를 Local Machine(나의 컴퓨터)에 다운로드한 뒤 해당 파일을 로컬 저장소로 만듦으로써 오픈 소스 프로젝트에 대한 작업을 할 준비가 완료될 것이다.
Fork와 Clone을 "다른 공간으로 소스 코드를 복제한다"라는 점에 집중하여 비교하려 하지 말고 작업의 흐름으로 이해하는 것을 추천한다.
새로운 메일 계정으로 회원가입할 수도 있을 것이다.
(그리고 이렇게 테스트하는 것이 조금 더 구별이 쉽다)
하지만 만약 여러 계정을 사용하기 싫다면 Gmail의 +
기능을 사용한다면 하나의 계정으로도 여러 Github 계정을 생성할 수 있다.
만약 test@gmail.com
주소를 가지고 있다면 test+1@gmail.com
, test+main@gmail.com
같은 형식으로 +
뒤에 아무 글자나 붙여 가입한다면 모든 메일이 test@gmail.com
으로 오도록 여러 계정을 생성할 수 있다.
어떤 방식으로 만들지는 선택이다.
(필자는 그냥 다른 Github 계정을 만들었다)
이 작업을 수행하기 전 Fork 할 Github 원격 저장소의 URL을 복사해두자.
URL을 복사해두었다면 이후 Github 계정으로 로그인하자.
새로운 Github 계정 프로필 사진
Main 브랜치만 받고 싶다면 체크 해제를 하지 않아도 되지만 이왕이면 완벽히 동일하게 원격 저장소를 가져오고 싶을 것이므로 Copy the main branch only
버튼 체크를 해제해 주자.
이후 Create Fork
버튼을 클릭해 주면 Fork가 완료된다.
아래 내용을 깔끔히 지우고 Fork를 통한 기여
문구를 추가했다.
이후 Pull request를 생성하듯 Create pull request
버튼을 클릭하면 된다.
새로 생성한 계정에서 만들었던 Fork를 통한 기여
Pull Request가 생성되었음을 볼 수 있다.
추가로 만약 Pull request
에 대한 피드백을 기존 원격 저장소에서 했더라도 Fork를 통해 복사한 원격 저장소에선 이를 확인할 수 없으므로 피드백 자체는 기존 원격 저장소에서 확인해야 한다.
기존 원격 저장소 계정 주인이 Pull request
를 승인한다면 Insights > Contributors
에 새로운 Github 계정이 추가되는 것을 볼 수 있다.
기본적으로 원격 저장소에 커밋을 직접 푸시 할 수 있는 사람은 원격 저장소를 만든 본인뿐이다.
하지만 협업을 위해선 다른 사람들도 원격 저장소에 Push를 수행할 수 있어야 하며 이를 위해 다른 계정을 협력자로 등록해야 한다.
방법은 Settings -> Collaborators
페이지에 들어가 Add people
버튼을 클릭한 뒤 Github 계정의 user name, full name, 혹은 email을 입력해 주면 된다.
이름을 입력하면 후보가 될 수 있는 계정들을 Github 자체적으로 찾아 보여준다.
추가할 계정을 선택한 뒤 Select a collaborator above
를 클릭하면 해당 계정의 Email로 초대 문자가 오며 View invitation
을 클릭한 뒤 Github에서 Accept invitation
을 클릭하면 협업자로 등록할 수 있으며 기존 원격 저장소에 대한 Push 및 수정이 가능해진다.