코드 저장소

공부에는 끝이 없다!

Git

Git - Fork : 저장소 복제하기

VarcharC2K 2024. 1. 2. 16:00

Git을 사용하다 보면 다른 사람의 오픈소스를 사용하게 될 일이 많다.

예를 들어, 우리가 대시보드를 만드는 프로젝트를 진행하려 하는데 운 좋게 우리가 쓰려는 기능이 잘 만들어져 있는 오픈소스를 발견했다고 하자.

여기에는 대화형 기능이 빠져있어서 우리는 대화형 기능을 해당 오픈소스에 추가하여 해당 오픈소스에 기여를 하고자 한다.

그런데 Push 권한은 Collaborators로 등록이 되어야 받을 수 있기 때문에 소스 수정이 불가능하다.

그렇다면 우리는 오픈소스에 기여하기 위하여 Collaborators로 등록을 해달라고 요청을 해야할까?

 

Fork는 이런 상황에서 사용된다.

Fork 명령어를 사용하면 해당 저장소를 통째로 나의 계정에 복사해 와서 자유롭게 소스 수정을 하고 Commit,Push를 하는 것을 가능하게 한다.

그리고 수정이 끝난다면 내 저장소의 Branch와 원본의 Branch를 머지해달라고 요청만 하면 간단하게 오픈소스에 기여를 할 수 있다.


Branch? Fork? Clone?

얼핏 보면 Branch와 Fork, Clone이 조금 헷갈릴 수도 있다.

Branch,Clone과 Fork의 가장 큰 차이는, 원본저장소에 영향을 미치는 여부이다.

정리의 차원에서 Branch와 Fork, Clone을 한번 비교해 보도록 하자.

 

1. Branch

Branch는 앞선 글에서 설명했듯 하나의 저장소에서 분기를 나누는 개념이다.

하나의 저장소에서 분기를 발생시키기 때문에 원본저장소의 코드 커밋 이력을 전부 확인 가능하며 내가 변경하는 변경사항이 원본 저장소에 직접적으로 영향을 미친다.

때문에, 다수의 사용자가 많은 Branch를 만들어 사용하게 되면 관리가 어려워지는 단점이 있다.

 

2. Clone

Clone의 경우 원격 저장소에 있는 모든 코드와 히스토리를 로컬로 복제하는 개념이다.

단, Commit, Push와 같은 경우 Collaborator로 추가되어 권한이 있어야 하며 수정시 원본 저장소 자체가 수정된다.

대부분의 소규모는 Clone으로 받은 후 Branch를 만들어 진행하게 되며 로컬에서 작업을 날렸는데 원격 저장소에서도 작업이 날아간 경우 복구가 어렵다는 단점이 있다.

3. Fork

이와 반대로 Fork는 저장소 자체를 분기하여 여러개로 만드는 개념이다.

영화로 비유를 한다면 일종의 리메이크작을 만든다고 생각해도 좋다.

원본과 내용이 거의 비슷하겠지만 리메이크작의 내용을 어떻게 진행시킬지는 전적으로 리메이크작의 감독의 마음에 달려있다.

우리가 리메이크를 어떻게 만들든 그 스토리가 원본 영화에 영향을 주지 않는 것처럼, Fork로 만들어진 저장소에서 어떤 작업을 했다 한들 원본 저장소에는 영향이 가지 않는다.

그렇기 때문에 우리는 Fork로 복제된 저장소에서 마음껏 코드를 수정할 수 있는 것이다.

반대로, 원본 저장소에 영향을 미치지 않기 때문에 원본 저장소의 이력을 보려면 따로 주소를 추가해 주어야 하는 단점이 있다.


Fork 해보기

그러면 실제로 Git에서 오픈 소스를 fork를 통하여 복제하여 보자.

우선 fork를 할 오픈소스에 들어간다.

나는 Git 강의에서 제공해 준 저장소를 이용하였지만 필요시 다음과 같은 오픈소스 저장소를 이용해도 좋다.

https://github.com/spring-projects/spring-boot

 

GitHub - spring-projects/spring-boot: Spring Boot

Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.

github.com

 

그러면 우측상단에 버튼이 3개 있는것이 보일 것이다.

Fork 버튼을 누르면 다음과 같은 창으로 넘어오게 된다.

Fork할 Repository 명을 만들어 주어야 하는데 나는 GitForkTest라는 이름으로 저장소를 생성하였다.

강의 정보 보호를 위하여 모자이크 처리하였다.

 

저장소가 생기면 이전과 다른 것을 확인할 수 있는데 우선 Owner가 내것으로 되어있는 것이 확인이 가능하지만, 하단에 보면 Forked From이라고 해서 원본 저장소의 위치가 나타 날 것이다.

fork된 저장소를 받아오려면 Code를 눌러 Url을 복사한 후 Clone으로 내려받으면 정상적으로 사용이 가능하다.

 


원본 저장소의 히스토리 등록하기

앞서 설명했든 fork된 저장소는 원본 저장소와 완전히 별개이기 때문에 원본 저장소의 히스토리를 받아오기 위해선 추가적으로 작업을 해주어야한다.

보통 UpStream이라고 부르는데, 원본 저장소의 주소를 알려주고 원본 저장소의 변경사항을 알기 위함이다.

여기서는 소스트리를 이용하여 upstream을 등록하도록 하겠다.

우선 화면 우측의 원격에서 우클릭을 눌러 새 원격을 등록해준다.

 

그럼 다음과 같은 설정 페이지가 나타나난다.

 

현재 연결되어있는 원격 저장소의 경로가 여기에 저장되는데 지금은 보면 우리가 Fork로 가져온 복제된 저장소의 위치만 설정되어 있는 상태이다.

따라서, 추가를 눌러 새로운 원본 저장소의 경로를 추가해주어야한다.

 

원격 이름은 upstream으로 하고 Url / 경로에 실제 원본의 Url을 적어 준 후 확인을 누른다.

그럼 다음과 같이 2개의 원격 저장소가 설정된 것을 확인 할 수 있다.

 

정상적으로 처리가 완료되었다면 원격에 2개의 저장소가 나타날 것이다.

또한, Fetch를 받아보면 히스토리에서 원본 저장소의 변경 내용과, fork된 저장소의 변경 내용이 모두 나타나는 것을 확인 할 수 있다.

 

Tag를 잘보면 upstream/ 로 되어있는 것은 원본 저장소이고 Origin/으로 되어있는 것은 우리가 fork한 복제된 저장소의 것이다.

이것으로 Fork를 하고 upstream으로 원본 저장소를 추적하는 방법을 알아보았다.

'Git' 카테고리의 다른 글

Git - Git의 여러가지 기능  (1) 2024.01.04
Git - Pull Request 사용해보기  (0) 2024.01.03
Git - 충돌과 충돌 해결 실습해보기  (1) 2023.12.30
Git - Merge와 Conflict  (0) 2023.12.29
GIT - Branch 나누기  (2) 2023.12.29