다른 사람의 저장소에서 원격 지점을 가져 오는 방법


266

누군가가 포크 한 GitHub에 호스팅 된 프로젝트가 있습니다. 포크에 새 분기 "foo"를 만들고 몇 가지 사항을 변경했습니다. "foo"를 내 저장소의 "foo"라는 새 분기로 가져 오려면 어떻게합니까?

본인이 풀 요청을 제출할 수 있음을 이해했지만이 과정을 직접 시작하고 싶습니다.

다음을 가정하십시오.

  1. 그들이 내 프로젝트를 포크했기 때문에 우리의 두 저장소는 모두 같은 '역사'를 공유합니다.
  2. GitHub가 그들의 프로젝트가 내 프로젝트에서 분기되었다고 표시하지만 내 로컬 저장소에는이 사람의 프로젝트에 대한 참조가 없습니다. 리모컨으로 리모컨을 추가해야합니까?
  3. 아직 "foo"라는 브랜치가 없습니다. 먼저 수동으로 만들어야하는지 모르겠습니다.
  4. 나는 이것이 내 주인이 아닌 별도의 지점으로 끌어 들이고 싶습니다.

답변:


349
git remote add coworker git://path/to/coworkers/repo.git
git fetch coworker
git checkout --track coworker/foo

이것은 로컬 지점을 설정 foo하고 원격 지점을 추적합니다 coworker/foo. 따라서 동료가 변경 한 내용을 쉽게 가져올 수 있습니다.

git checkout foo
git pull

의견에 대한 답변 :

Cool :) 그리고 해당 분기를 직접 변경하려면 "foo"에서 두 번째 로컬 분기 "bar"를 작성하고 "foo"에서 직접 대신 작업해야합니까?

내가 추천하더라도 새 브랜치를 만들 필요는 없습니다. 또한 foo동료 에게 직접 커밋 하고 동료가 지점을 가져 오도록 할 수도 있습니다. 그러나 해당 지점이 이미 존재하며 foo지점을 업스트림 지점으로 설정해야합니다.

git branch --set-upstream foo colin/foo

가정 colin저장소 유사한 방식으로 정의 (리포지토리 동료에 대한 원격)입니다 :

git remote add colin git://path/to/colins/repo.git

3
매우 빠릅니다 :) git://다른 사람의 GitHub 리포지토리 페이지에서 URL을 대신 사용해야한다는 것을 추가하고 싶을 수도 있습니다 //path/to/coworkers/repo.git. (그것이 나의 답변을 너무 느리게 만든 것이라고 설명했다.)
Mark Longair

Cool :) 그리고 해당 분기를 직접 변경하려면 "foo"에서 두 번째 로컬 분기 "bar"를 작성하고 "foo"에서 직접 대신 작업해야합니까?
Colin O'Dell

아니면 내 "foo"에서 직접 작업하고 나중에 변경 사항을 가져 오거나 병합하는 것이 안전합니까? 가장 좋은 방법은 무엇입니까?
콜린 오델

1
완벽하게, 그것은 내가 찾던 것입니다 :) 당신의 도움에 감사드립니다 !!
Colin O'Dell

1
3 분만에 좋은 답변!
Tieme

103

아니요, 리모컨으로 추가하지 않아도됩니다. 그것은 매끄럽고 매번 할 고통입니다.

커밋 잡기 :

git fetch git@github.com:theirusername/reponame.git theirbranch:ournameforbranch

이렇게하면 로컬 분기가 만들어졌으며 해당 분기 ournameforbranch와 정확히 동일한 이름 이 theirbranch됩니다. 질문 예제의 경우 마지막 인수는입니다 foo:foo.

참고 :ournameforbranch자신의 지점 중 하나와 충돌하지 않는 이름을 생각하는 것은 귀찮은 인 경우 부분은 더 중단 할 수 있습니다. 이 경우 호출 된 참조 FETCH_HEAD를 사용할 수 있습니다. 당신 git log FETCH_HEAD은 그들의 커밋을보고 cherry-picked체리를 커밋하는 것과 같은 일을 할 수 있습니다 .

다시 그들에게 푸시 :

종종, 당신 은 그들의 무언가 를 고치고 그것을 바로 뒤로 밀고 싶어합니다 . 그것도 가능합니다 :

git fetch git@github.com:theirusername/reponame.git theirbranch
git checkout FETCH_HEAD

# fix fix fix

git push git@github.com:theirusername/reponame.git HEAD:theirbranch

에서 작업하는 경우 분리 된 상태 것이 당신을 걱정, 반드시 지점을 사용하여 생성 :ournameforbranch및 교체 FETCH_HEADHEAD와 위 ournameforbranch.


2
감사합니다. 귀하와 다른 사람이 같은 이름의 지점 (기본 master지점)을 가지고있는 경우 다른 답변이 작동하지 않습니다.
Job

2
이 방법은 당신이 당신의 GitHub의 계정과 연결된 SSH 키와 같은 물건이없는하지 작동하는지 언급 할 그것의 가치를 참조 stackoverflow.com/questions/12940626
Przemek D

공동 작업자로 추가되어 리포지토리에 추가되지 않아도 되나요?
Honey

@ 허니 확실히! 푸시는 원격 엔드에서 푸시하는 데 필요한 권한이 있다고 가정합니다. 가져 오기도 마찬가지로 경로에 액세스 할 수 있다고 가정합니다.
antak

git branch -m newbranch이 분리 된 상태에서 실행하면 git은 마음을 잃고 repo가 ​​더 이상 유효하지 않다고 말하기 시작합니다. git init"newbranch"라는 브랜치를 사용하여 이전의 상태를 수정하고 다시 되돌릴 수 있습니다.
이안 son 슨

14

antak의 답변 인 경우 :

git fetch git@github.com:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 

당신에게 제공합니다 :

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

그런 다음 (Przemek D의 조언에 따름) 사용

git fetch https://github.com/<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH>

6

다음은 다른 사용자의 포크에서 PR 브랜치를 체크 아웃하기 위해 GitHub와 함께 작동하는 멋진 편리한 솔루션입니다. 풀 요청 ID (GitHub가 PR 제목과 함께 표시 함)를 알아야합니다.

예:

당신의 안전하지 않은 코드를 수정 # 8
앨리스는 1로 커밋 병합 싶어 your_repo:master에서her_repo:branch

git checkout -b <branch>
git pull origin pull/8/head

와 다른 경우 리모컨을 대체하십시오 origin. 올바른 풀 요청 ID로
대체 8하십시오.


2
더 많은 투표가 필요합니다. pe3rfectly 작동하고 최고 투표 응답으로 얻는 "치명적인 : 원격 참조를 찾을 수 없습니다"오류를 피했습니다. 감사!
Michael Romrell 18시 58 분

2 줄의 쉬운 코드. 이것을 공유해 주셔서 감사합니다! 이것보다 단 하나 뿐인 것은 업데이트를 쉽게 풀 요청에 병합하는 것입니다.
klewis

4

GitHub는 이전 답변과 관련하여 새로운 옵션을 제공합니다. PR에서 명령 행을 복사 / 붙여 넣기 만하면됩니다.

  1. PR 하단으로 스크롤하여 Merge또는 Squash and merge버튼 을 확인 합니다
  2. 오른쪽의 링크를 클릭하십시오 : view command line instructions
  3. 1 단계 오른쪽에있는 복사 아이콘을 누릅니다.
  4. 터미널에 명령을 붙여 넣기

2

갈래 리포지가 보호되어 있으므로 직접 푸시 할 수 없으며 목표가 foo를 변경하는 것이라면 분기 foo를 리포지토리로 가져와야합니다.

git remote add protected_repo https://github.com/theirusername/their_repo.git
git fetch protected_repo 
git checkout --no-track protected_repo/foo

이제 업스트림이없는 로컬 foo 복사본이 있습니다. 변경 사항을 커밋하거나하지 않고 foo를 자신의 원격 저장소에 푸시 할 수 있습니다.

git push --set-upstream origin foo

이제 foo가 GitHub의 리포지토리에 있고 로컬 foo가 추적하고 있습니다. 그들이 계속 foo를 변경하면 그것들을 가져 와서 당신의 foo로 병합 할 수 있습니다.

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