2011-11-12 6 views
4

나는 repo를 포크로 가져 오는 요소를 이해/시각화하려고합니다. 내 시작 참조는 help page입니다.힘 : 포크/원격/복제품 개념

1 질문 : 나는, 예를 들어 REPO를 포크

GitHub의 스푼 나이프 (즉, 사이트에서 Fork 버튼을 클릭 함) 스푼 나이프이 내 GitHub 계정에 복사됩니까? 실제 사본이 실제로 발생 했습니까 아니면 개념일까요?

2 질문는 :

$ 자식 클론 [email protected] : 사용자 이름/넓적 Knife.git

도움말 페이지의 다음 단계는 복제을하는 것입니다

이 명령은 내 로컬 컴퓨터에서 원본 복사본을 만들었습니다. 내 GitHub 계정의 분기/복사 된 Repo에서 복제 했습니까 (내 첫 번째 질문을 참조하십시오)? 또는 원래보다 스푼 나이프 레오?

세번째 질문 :

의 repo가 ​​복제되어

, 그것은 GitHub의에 포크가 아닌 원래의 repo를 가리키는 원격 origin라는 기본을 가지고 구성 리모컨에 대한

단계 에서 포크했다. 원래 저장소를 추적하려면 upstream이라는 다른 리모컨을 추가해야합니다.

내 GitHub 계정의 로컬 복사본과 리포 사본간에 origin 어떤 종류의 "프록시"가 있습니까? 그리고 upstream은 어떨까요?

미리 도움 주셔서 감사합니다.

답변

4
  1. "fork"할 때 실제로 할 수있는 git 저장소에 브랜치를 효과적으로 만드는 것입니다.

  2. 복제 할 로컬 사본은 git-hub에서 생성 한 브랜치에서 복제되고 링크됩니다. 브랜치는 커밋 객체에 대한 포인터 일 뿐이라는 것을 기억하십시오. 따라서 "forked"할 때 자신의 레포에 현재 마스터 헤드를 가리키는 브랜치 이름을 추가했습니다.

  3. 리모컨은 외부 주소에있는 리포지토리의 이름입니다. 기본 "origin"은 자식에 의해 설정되며 단지 이름이 지정된 원격입니다. "업스트림"은 다른 이름이고 원래 분기 한 원래 마스터를 가리키며 마스터와 자신의 분기간에 변경 사항을 가져올 수 있습니다. 리모컨은 git remote -v으로 볼 수 있으며 쉽게 추가하여 외부에서 사용할 수있는 git repo의 모든 지점을 추적 할 수 있습니다.

+0

# 1과 # 2에 대한 화려한 설명. 고맙습니다! 그래서,'origin'은 포크 후 자동으로 만들어 집니까? – moey

+0

원본/마스터에서 새 변경 사항을 가져 오면 원본을 '원본'으로 가져 오거나 내 로컬 사본으로 직접 가져옵니다? – moey

+1

복제 할 때'origin'이 생성됩니다. 리모콘은 이름과 포인터 이상에 불과합니다. 다음과 같이하면 :'git init --bare Base; git clone 기본 dev1; cd dev1; git remote' 당신은'origin'을 이름으로 사용하고 dev1이 가리키는 Base repo에 대한 경로는 git-hub의 경우 ssh 참조가 될 것입니다. 예제에서는 간단한 경로이지만 둘 다 정보를 얻을 위치를 git에게 알려주십시오. 리모트는 다른 사람들 저장소를 추적하고,'origin'은'git clone'을 사용할 때 git이 사용하는 기본 이름입니다. –

1

예 : GitHub의 스푼 나이프는 스푼 나이프가 내 GitHub 계정에 복사되는 것을 의미합니까?

예.

실제 사본이 실제로 발생 했습니까 아니면 단지 개념입니까?

Github의 끝 부분에 구현 세부 사항이 있습니다. 너에게 중요하지 않아야 해. (나는 그들이 스토리지를 공유하고 있음을 확신한다).

내 GitHub 계정에서 분기 된/복사 된 Repo에서 복제 되었습니까? 또는 원래의 스푼 나이프 리포에서

사용자 계정의 레포에서 가리 키기 때문에, 거기에서 복사했기 때문입니다. 두 포크의 내용은이 시점에서 동일합니다.

내 GitHub 계정의 로컬 복사본과 레포 복사본 사이에 어떤 종류의 "프록시"가 있습니까? 그리고 업스트림은 어떨까요?

아니요. "origin"은 GitHub의 저장소에 대한 식별자로,이 저장소와 쉽게 통신 할 수 있습니다. "upstream"도 똑같이 작동합니다. 이 리모컨을 설정할 필요는 없지만, 자주 사용하는 모든 리포즈 (변경 사항을 밀거나 당겨)를 사용하면 쉽게 작업 할 수 있습니다. "원산지"와 "상류"라는 이름은 단지 관습에 따르는 것이어야하며, 그들에게 "마법"은 없습니다.

+0

감사합니다. Thilo. 마지막 답변에 관해서는 원래의 Repo로 지정할 수 있습니까? 그렇다면 우리는 실제로 포크를 할 필요가없는 것처럼 들립니다. – moey

+1

변경하려는 경우에만 포크가 필요합니다. Github에이 포크가있을 필요는 없습니다 (로컬로만 또는 다른 서비스에서 가져올 수 있습니다).하지만 Github은 꽤 편리합니다. 특히 좋은 웹 페이지와 소셜 기능으로 푸시하고 검토 할 수 있기 때문입니다. changesets. – Thilo

+1

아 ... 지금은 더 이해가됩니다. 변경해야 할 때 포크. 나는 많은 사람들/사이트가 "GitHub에서 포크 나"라고 말하기 때문에 포크를 눈이 멀게 만들었지 만 때로는 내가 원하는 것은 소스를 얻는 것 뿐이라고 생각합니다. (: – moey

2

첫 번째 질문 :

복사했습니다. 사실 그것은 일종의 복제품입니다. 이제 github 계정에 프로젝트 사본 (실제로 지점 중 하나)이 있습니다.

두번째 질문 :

힘내 복제 명령은 당신이 그것을주는 REPO를 복제. 이렇게 $ git clone [email protected]:username/Spoon-Knife.git 복제품 숟가락 칼은 username에서 repo. 그것은 당신의 계정입니다, 그래서 넓적 나이프 REPO :

세번째 질문의 사본의 사본의 경우

origin 프록시 아니라, 다른 REPO 단지의 이름입니다. 예를 들어 다음 명령을 local_srv라는 이름의 환매 특약을 추가

git remote add local_srv /path/to/local/srv 

upstream는 또 다른 원격입니다. 가져 오도록 구성 할 수 있습니다 (즉, 업데이트 가져 오기).

origin은 github 저장소 (원격 전화는 github입니다)이며 원래 스푼 나이프 저장소에 upstream 원격을 추가 할 수 있습니다. 프로젝트에서 로컬로 작업하려면 github 계정 (예 : git push origin master)을 누르고 git pull upstream master을 사용하여 스푼 나이프 프로젝트의 새 업데이트를 가져옵니다.

참고 : 여기에서는 master 만 사용했지만 원하는 지점으로 바꿀 수 있습니다.

+0

감사합니다, @Geoffroy! 처음 프로젝트를 포크했을 때'origin'이 자동으로 생성 되었습니까? 아니면 복제 명령의 부산물입니까? – moey

+0

예.'git remote'를 사용하여 리모컨의 현재 목록 :) – Geoffroy

4

당신은 포크복제의 개념을 구별 할 필요가있다. 당신이 저장소를 복제 할 때, 당신은 당신의 자신의 새로 만든 저장소로의 모든 역사와 데이터를 복사 :

  • 복제은 GitHub의 전에 존재 힘내 개념이다. 또한 원격origin이라는 새 저장소에 자동으로 만들어지며 복제 된 저장소로 다시 연결됩니다.

  • 포크은 핵심 Git이 인식하지 못하는 GitHub 개념입니다. GitHub 프로젝트를 포크 할 때 자동으로 업데이트되는 포크 그래프와 같은 모든 GitHub 기능을 사용하여 원본과 동일한 자신 만의 GitHub 프로젝트를 만듭니다. 또한 포크에는 원래 프로젝트에서 Git 저장소를 복제하고 새로 생성 된 프로젝트에서 새 Git 저장소를 만드는 작업이 포함됩니다. 당신이 당신의 자신의 개인 컴퓨터에서 GitHub의 프로젝트를 작업 할 때

, 당신은 상관없이 당신의 저장소 또는 다른 사람의인지, 먼저 저장소를 복제 할 필요가있다. GitHub 프로젝트에서 클론 한 경우 출처는이지만 원 프로젝트를 리모컨으로 원하면 수동으로 추가해야합니다 (업스트림). 예).

+0

감사합니다, 대니얼! 마지막 단락을 명확히하기 위해 : 내 GitHub 프로젝트에서 복제하면 ** 원점 **에서 내 GitHub 저장소를 가리 킵니다. 맞습니까? _remote_는 원격 저장소를 가리키는 로컬 포인터 인 것 같습니다. – moey

+0

원래 프로젝트에 새로운 변경 사항이있을 때 GitHub에서 프로젝트를 먼저 업데이트 한 다음 로컬 복사본으로 프로젝트를 업데이트해야합니까? 아니면 원래 프로젝트에서 내 컴퓨터로 직접 업데이트 할 수 있습니까? – moey

+1

@ Siku-Siku.Com correct, a * remote *는 다른 저장소에 대한 로컬 포인터입니다. 두 번째 질문에 대해서는 두 가지 옵션이 있습니다. GitHub 프로젝트를 업데이트하려면 GitHub의 "Fast-Forward"버튼을 사용하십시오 (아직 프로젝트에 커밋을하지 않은 경우에만 가능). 머신의 저장소를 업데이트하려면 원본 프로젝트의 저장소를 원격 (** 업스트림 ** 위)으로 추가하고 그곳에서 당겨냅니다. 원하는 경우 GitHub 프로젝트로 이동할 수도 있습니다. –

1

git를 사용하면 각 저장소가 전체 기록을 가져옵니다. 사실 (로컬 저장소간에 데이터를 공유하는 일부 최적화 제외) 각 저장소는 다른 저장소의 복제본입니다. 또는 git hub에서 포크를 말하십시오 (그들은 같은 것입니다).

그래서 원래 개발자 저장소, git 허브의 복제본 (포크라고 부름) 및이 복제본의 로컬 복제본이 있습니다. 이름 origin은 저장소 (git hub) (첫 번째 복제본)를 참조하기위한 축약 이름 일뿐입니다. 이 속기가 없으면 각 단계에서 전체 URI를 저장소에 제공해야합니다.

저장소에는 다른 저장소와 같은 많은 축약 된 이름이있을 수 있습니다. 히스토리가 단일 루트를 가진 단순한 지정 비순환 그래프이기 때문에 모두 동일한 원본 저장소의 복제본 인 것이 좋습니다.

git 허브에서 중간 복제본 없이도 작업 할 수 있었지만 원래 개발자 저장소에 대한 쓰기 권한이 없으며 개인 저장소에 액세스 할 수 없게 될 수 있으므로 git 허브의 저장소 당신과 원저자 사이의 패치를위한 통신 게이트웨이로 사용될 수 있습니다.

1

3의 repos는 "포크", 당신은 당신이 그것을에 대한 읽기/쓰기 액세스 권한이 점에서 실제 사본을해야합니까

original - {GitHub}/octocat/Spoon-Knife 
forked - {GitHub}/ mine/Spoon-Knife 
local - {local}  /Spoon-Knife 
  1. . 그러나이 방법은 "원래 쓸 저장소에 저장소를 만들 수있는 방법"으로 효과적으로 생각할 수 있습니다.

  2. "fork"작업은 original을 GitHub 계정에 복사했습니다.local 복제본을 forked (아니 original)로 직접 푸시 할 수 있습니다.

  3. 단순히 remote은 외부 주소의 저장소 이름입니다.
    "기원"- forked 포인트
    "상류"("기원은"기본 remote 이름) - 그래서 당신은 당신이 당신의 리모컨을 볼 수 있습니다 당신의 repos

을에 변화를 가져올 수 있다는 original 포인트 git remote -v 그리고 그들을 쉽게 추가하여 외부에서 사용할 수있는 git repo의 모든 지점을 추적하십시오.

부분적으로 Mark의 대답에서 파생됩니다.