GitHub에서 Forking과 Cloning의 차이점은 무엇입니까?


187

프로젝트의 포크를 수행하는 것과 프로젝트를 수행하는 clone것의 차이점을 알고 싶습니다 .

프로젝트를 분기 한 경우 GitHub를 통해서만 풀 요청을 보낼 수 있습니까?



2
여기 착륙하는 사람들은 Git (GitHub 아님)과 함께 "포크"에 대한 설명을 찾고 있습니다. Git에는 "fork"명령이 없습니다. GitHub (Git 아님) 개념입니다. 쉽게 잊혀진 구별.
ambassallo

답변:


113

기본적으로 그렇습니다. A fork는 GitHub가 프로젝트를 복제하고 사용자 이름으로 등록하도록 요청하는 것입니다 . GitHub는 또한 두 리포지토리 간의 관계를 추적하므로 두 프로젝트 (및 기타 포크) 간의 커밋 및 풀을 시각화 할 수 있습니다.

사용하지 않더라도 복제 된 저장소에서 사람들이 가져 오기를 계속 요청할 수 fork있지만 공개적으로 사용할 수 있도록해야합니다. 또는 개발자 git format-patch가 자신의 나무에 적용 할 수있는 패치를 보내십시오 (참조 ).


4
포크는 복제본보다 업데이트 작업에 더 많은 작업이 필요합니다. 간단한 복제본으로 업데이트 할 수 있습니다 git pull. 포크는 여러 명령을 수행합니다. 그리고 내가 본 거의 모든 포크가 구식입니다. 포크는 스테로이드의 Maven 저장소 문제와 같습니다. 오래된 레포 (Maven) 대신 수천 개 (Git)가 있습니다.
jww

@jww는 복제본을 사용하는 것이 가장 좋습니다. 왜 포크를 사용합니까?
serup

@serup-갈래의 사본이 될 수있는 이유 git pull는 여전히 존재하는 일종의 관계가 있습니다. 전체 복사본을 자신의 로컬 컴퓨터에 복사하고 원본 리포지토리에서 분리 한 경우.
JonH

134

저장소를 포크 한다고 말하면 기본적으로 GitHub ID 아래에 저장소 사본이 작성됩니다. 여기서 주목할 점은 원래 리포지토리에 대한 모든 변경 사항이 포크 리포지토리에 다시 반영된다는 것입니다 (가져와 리베이스해야 함). 그러나 분기 저장소를 변경 하면 원래 저장소에 대한 풀 요청을 명시 적으로 작성해야 합니다. 풀 요청이 원래 저장소 의 관리자에 의해 승인되면 변경 사항이 기존의 원래 코드 기반 과 커미트 / 병합됩니다 . 그때까지 변경 사항은 포크 한 사본에만 반영 됩니다 .

한마디로 :

포크 앤 풀 모델을 사용하면 누구나 기존 리포지토리를 포크하고 소스 리포지토리에 대한 액세스 권한을 부여하지 않고도 개인 포크에 변경 사항을 푸시 할 수 있습니다. 그런 다음 프로젝트 관리자가 변경 사항을 소스 저장소로 가져와야합니다.

포크 한 후에는 저장소 (이름 아래에있는 저장소)를 머신에서 로컬로 복제 할 수 있습니다. 변경 후 분기 저장소로 푸시하십시오. 그러나 원래 저장소에서 변경 사항을 반영하려면 풀 요청이 승인되어야합니다.

다른 흥미로운 토론의 몇 가지-

자식 포크는 실제로 자식 복제본입니까?

GitHub 분기 저장소를 어떻게 업데이트합니까?


24
"여기에서 주목할 점은 원래 리포지토리에 대한 모든 변경 사항이 분기 된 리포지토리에 다시 반영된다는 것입니다." 제 생각에는 약간 오해의 소지가 있습니다. AFAIK, 포크 이후 원래 저장소에 대한 변경 사항은 포크에 자동으로 반영 되지 않습니다 . 이러한 변경 사항을 수동으로 이동해야합니다. 포크 버튼을 클릭하면 포크 전에 발생한 변경 사항이 새 포크에 복사됩니다.
Ajedi32

"원래 저장소에 대한 변경 사항은 분기 저장소에 다시 반영됩니다." 아니 자동으로 I 희망
KansaiRobot

나는 고객의 프로젝트를 위해 일하고 있었고 복제 및 푸시 모델을 사용했습니다. 어느 날 나는 그것을 포크로 만들었고 즉시 완전한 레포를 포크해야 할 필요가 있다는 메시지가 나타납니다. 나는 그것이 어떻게 잘못 간주되는지 이해하지 못합니까?
user3075740

포크 후 원래 저장소에 변경 사항이 자동으로 포크에 반영하지만, 그렇게하기 위해서는,이 블로그의 3 단계를 확인하지 않습니다 : - help.github.com/articles/fork-a-repo
Suhas 치카 나

"원래 저장소에 대한 변경 사항은 분기 저장소에 다시 반영됩니다"– 복제 한 후에는 이것이 불가능하다는 것을 의미합니까?
변수

26
  • 갈래 프로젝트는 온라인 저장소 (repo)에 있습니다.
  • 복제 된 프로젝트는 로컬 컴퓨터에 있습니다 (보통 저장소를 포크 한 후에 복제합니다).

온라인 리포지토리에 커밋하거나 로컬 리포지토리에 커밋 한 다음 온라인 리포지토리로 푸시 한 다음 풀 요청을 보낼 수 있습니다.

프로젝트 관리자는 기본 온라인 버전에서 변경 사항을 가져 오도록 승인 할 수 있습니다.


13

복제본은 저장소의 두 버전 (아마도 다른 버전)을 적절히 복제하고 분리하는 곳입니다. 한 리포지토리가 수정되면 푸시 명령을 사용하여 새 컨텐츠를 다른 리포지토리에 적극적으로 복사해야합니다. 그리고 다른 저장소의 변경 사항을 가져 왔습니다.

서버에서 저장소를 포크 할 때 두 저장소 모두 동일한 서버에서 동일한 [고정 오브젝트] 컨텐츠를 사용하므로 컨텐츠 복제가 필요하지 않습니다. '트릭'은 서로 다른 사용자 관점을 관리하여 각 사용자가 자신의 레포에 대한 전체 개인 사본을 가지고 있다고 믿습니다. 포크 사이의 푸시 및 페치는 단순히 사용자의 포인터를 업데이트합니다.

하위 레벨에서 git은 내부적으로 동일한 작업을 수행합니다. 각각 Hello World에을 포함하는 세 개의 다른 파일이있는 경우 git은 Hello World blob의 단일 사본을 '포크'하고 필요에 따라 세 곳 각각에 파일을 제공합니다.

서버에서 포크 기능을 사용하면 모든 바디가 하나의 기본 리포지토리를 공유하므로 Github의 대용량 스토리지 허용량이 평균적으로 크지 않습니다.


5

간단히 말해서 Forking은 "GitHub ID / 프로필에서 복제"와 동일 할 것입니다. 포크는 복제본보다 낫지 만 몇 가지 예외가 있습니다. 분기 저장소는 복제 된 저장소와 달리 항상 원래 저장소와 모니터링 / 비교됩니다. 그러면 변경 사항을 추적하고 풀 요청을 시작하며 원래 리포지토리에서 변경 한 내용을 분기 된 항목과 수동으로 동기화 할 수 있습니다.


5

@AniketThakur의 답변은 매우 좋습니다. 아직 다음 질문에 아무도 답변하지 않았습니다.

프로젝트를 분기 한 경우 GitHub를 통해서만 풀 요청을 보낼 수 있습니까?

아니요. 저장소에 기고자 인 경우 다음을 수행 할 수 있습니다. 로컬 복제본을 만듭니다. 현지 지사를 만듭니다. 해당 분기에 커밋을 추가하십시오. 로컬 브랜치를 github로 다시 푸시하십시오 (프로세스에서 원격 브랜치를 생성). 해당 브랜치가 마스터 브랜치 (또는 원하는 브랜치)로 병합되도록 요청하는 풀 요청을 작성하십시오.


3

질문자가 암시 한 것을 수행 한 경우 (리 포크를 로컬로 복제하고 로컬로 복제하고 변경하고 풀 요청을 발행해야 함) 잊어 버렸습니다.

  1. 풀 요청을 보내려는 리포지를 포크하십시오.
  2. 로컬 변경 사항을 리모컨으로 푸시
  3. 풀 요청 발행

2

GitHub의 또 다른 이상한 미묘한 차이점은 변경 사항을 원래 리포지토리로 가져올 때까지 포크 변경 사항이 활동 로그에 포함되지 않는다는 것입니다. 또한 포크를 적절한 클론으로 변경하려면 Github 지원 센터에 문의해야합니다.

에서 왜 내 기여는 표시되지 않습니다 :

커밋은 포크로 만들어졌습니다.

포크로 만든 커밋은 귀하의 기부금에 포함되지 않습니다. 계산하려면 다음 중 하나를 수행해야합니다.

풀 요청열어 변경 사항을 상위 저장소에 병합하십시오. 포크를 분리하여 GitHub의 독립형 저장소로 바꾸려면 GitHub 지원 센터에 문의하십시오 . 포크에 자체 포크가있는 경우, 포크를 저장소와 함께 새 네트워크로 이동해야하는지 또는 현재 네트워크에 남아 있는지 지원 부서에 알려주십시오. 자세한 내용은 " 포크 정보"를 참조하십시오 .


2

간단히 말해서 "포크"는 자신의 GitHub 계정에 호스팅 된 프로젝트의 복사본을 만듭니다.

"복제"는 컴퓨터의 git 소프트웨어를 사용하여 소스 코드를 다운로드하고 해당 컴퓨터에 대한 전체 버전 기록입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.