원래 GitHub 저장소에서 분기 된 GitHub 저장소로 새 업데이트를 가져옵니다.


615

GitHub에서 누군가의 저장소를 포크하고 원래 저장소에서 수행 한 커밋 및 업데이트로 버전을 업데이트하고 싶습니다. 이것들은 내가 사본을 포크 한 후에 만들어졌습니다.

원본에서 작성된 변경 사항을 가져 와서 저장소에 통합하려면 어떻게해야합니까?


1
가능한 복제 또는 아마도 관련 : GitHub의 포크 간 병합 .

동기화하려는 추가 태그가있는 경우 git push --force origin --tags제안 된 솔루션 후에 수행하십시오!
MediaVince

답변:


716

원래 저장소 (포크 한 저장소)를 원격으로 추가해야합니다.

로부터 GitHub의 포크 맨 페이지 :

포크

복제가 완료되면 origin리포지토리에 GitHub의 포크를 가리키는 “ ” 라는 리모컨이 있습니다.
이름을 혼동하지 마십시오. 이것은 원래 포크를 가리키는 것이 아닙니다. 해당 리포지토리를 추적 할 수 있도록“업스트림”이라는 다른 리모컨을 추가합니다.

$ cd github-services
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream

# then: (like "git pull" which is fetch + merge)
$ git merge upstream/master master

# or, better, replay your local work on top of the fetched branch
# like a "git pull --rebase"
$ git rebase upstream/master

GitHub 작업을 용이하게 하는 루비 젬있습니다 .

갈래

" 깃 포크는 git clone? " 도 참조하십시오 .


14
좋은 요약 은 bassistance.de/2010/06/25/git-fu-updating-your-github-fork 를 참조하십시오 .
VonC

2
@syedrakib 나는 선호 git rebase upstream/master하지만 대답에 두 가지 가능성을 추가했습니다.
VonC

1
@PaBLoX 당신이 repo를 포크했다면, 당신은 당신의 브랜치 에서 repo를 작업하고 있습니다 : rebase and push a push : 엉망이 아닙니다. 진행중인 풀 요청도 올바르게 업데이트됩니다.
VonC

2
@PaBLoX 당신은 혼란을 일으키지 않습니다 : 당신 git push --force은 GitHub의 브랜치 히스토리를 방금 리베이스 한 로컬 브랜치로 대체합니다. 당신 만이 슬픈 가지를 사용하고 있기 때문에 혼란이 없습니다.
VonC

2
이해 했어요. 나는 여전히 어렵고 사소하며 직관적이지 않다고 생각합니다. 여전히 내 변경 사항이 항상 맨 위에 표시되는 것은 이상하지만 실제로는 이전에 변경 한 것입니다. 이전에 게시 한 솔루션이 더 좋아 보입니다 (여전히 중요하지 않음). 문제는 커밋 해시 변경 사항 (새로운 부모가 있기 때문에)이 문제가 호출 될 때 github 내부에 많은 노이즈를 생성한다는 것입니다. 그럼에도 불구하고 업스트림에 대한 업데이트를 유지하고 기록에 대한 무의미한 병합 커밋 또는 "거짓말"을 만들지 않고 자신의 포크를 관리 할 수있는 방법이 없다는 것이 놀랍습니다.
Pablo Olmos de Aguilera C.

99

VonC의 답변 외에도 원하는대로 조정할 수 있습니다.

원격 브랜치에서 가져온 후에도 커밋을 병합해야합니다. 나는 교체 할 것이다

$ git fetch upstream

$ git pull upstream master

git pull은 본질적으로 git fetch + git merge이기 때문에.


업스트림 브랜치에 기존 파일이 변경되지 않았지만 리소스 파일이 거의 추가되지 않았다는 것을 알고 있다면 어떻게해야합니까?
azec-pdx

4
확실히 그 경우에 빨리 진행할 것입니다
Domness

업스트림 마스터가 모든 로컬 파일을 덮어 쓰는 방법 (병합 충돌 없음)이 경우 업스트림 마스터가 코드를 이끌고 있으므로이를 100 % 신뢰할 수 있습니다.
snh_nl

1
@snh_nl git rebase upstream master에서 충분히 분기 된 경우 충돌이 발생하지 않습니다 upstream/master. 참조 git-scm.com/docs/git-rebase (TL; DR을 : 상류의이 하드 리셋 지역 마스터하고 앞으로 분기의 관점에서 로컬 커밋을 모두 remerge 시도)
cowbert

68

비디오GitHub에서 직접 포크를 업데이트하는 방법을 보여줍니다

단계 :

  1. GitHub에서 포크를 엽니 다.
  2. 를 클릭하십시오 Pull Requests.
  3. 를 클릭하십시오 New Pull Request. 기본적으로 GitHub는 원본을 포크와 비교하므로 변경하지 않은 경우 비교할 내용이 없습니다.
  4. 를 클릭하십시오 switching the base. 이제 GitHub는 포크와 원본을 비교할 것이며 모든 최신 변경 사항을 볼 수 있습니다.
  5. Create a pull request이 비교를 클릭하고 풀 요청에 예측 가능한 이름을 지정하십시오 (예 : 원본에서 업데이트).
  6. 를 클릭하십시오 Create pull request.
  7. 아래로 스크롤하여 클릭 Merge pull request하고 마지막으로 Confirm병합하십시오. 포크에 변경 사항이 없으면 자동으로 병합 할 수 있습니다.

3
불행히도이 멋진 그래픽 방법은 위에서 언급 한대로 허용 된 답변에 대한 주석에서 언급 한 것처럼 포크에 노이즈를 추가합니다. 따라서 명령 행 방법이 권장됩니다. help.github.com/articles/syncing-a-fork
Jonathan Cross

나는 switching the base옵션을 찾을 수 없었다
alper

64

사용하다:

git remote add upstream ORIGINAL_REPOSITORY_URL

그러면 업스트림이 분기 저장소로 설정됩니다. 그런 다음이 작업을 수행하십시오.

git fetch upstream      

원래 저장소에서 master를 포함한 모든 분기를 가져옵니다.

이 데이터를 로컬 마스터 브랜치에 병합하십시오.

git merge upstream/master

갈래 저장소로 변경 사항을 푸시하십시오.

git push origin master

짜잔! 원본 리포지토리 동기화가 완료되었습니다.


어떻게 않는 한 우리가 100 %를 신뢰할 수 있도록 (NO 병합 충돌 때문에) 상류 마스터이 경우 코드에서 선도 ... 모든 로컬 파일, 덮어 쓰기 상류 주인을 이렇게 관리해야
snh_nl

한 가지 방법은 단순히 로컬 복사본을 삭제하고 새로 복제하는 것입니다. :)
ARK

1

GitHub 데스크톱 애플리케이션을 사용하는 경우 오른쪽 상단에 동기화 버튼이 있습니다. 그것을 클릭 한 다음 Update from <original repo>왼쪽 상단 근처에서 클릭하십시오 .

동기화 할 변경 사항이 없으면 비활성화됩니다.

다음은 스크린 샷 이 쉽게 할 수는.


1

잃을 것이 없다면 포크를 삭제할 수도 있습니다. 설정으로 이동하십시오. 아래의 위험 구역 섹션으로 이동하여 저장소 삭제를 클릭하십시오. 리포지토리 이름과 암호를 입력하라는 메시지가 표시됩니다. 그런 다음 원본을 다시 포크하십시오.


1

cli없이 수행하려면 Github 웹 사이트에서 완전히 수행 할 수 있습니다.

  1. 포크 저장소로 이동하십시오.
  2. 를 클릭하십시오 New pull request.
  3. 포크를 기본 저장소로 설정하고 원래 (업스트림) 저장소를 헤드 저장소로 설정하십시오. 일반적으로 마스터 브랜치 만 동기화하려고합니다.
  4. Create new pull request.
  5. 병합 버튼 오른쪽의 화살표를 선택하고 병합 대신 리베이스를 선택하십시오. 그런 다음 버튼을 클릭하십시오. 이렇게하면 불필요한 병합 커밋이 생성되지 않습니다.
  6. 끝난.

0

분기 저장소와 상위 저장소를 자동으로 동기화하려면 GitHub 에서 Pull 앱 을 사용할 수 있습니다.

자세한 내용은 Readme 를 참조하십시오.

갈래 저장소에 대한 변경 사항을 유지하려는 고급 설정에 대해서는 여기 에서 비슷한 질문에 대한 내 대답을 참조 하십시오 .

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