다른 포크에서 병합되지 않은 업스트림 풀 요청을 포크에 적용하는 방법은 무엇입니까?


465

포크가있는 GitHub의 프로젝트에는 작성자가 아직 가져 오지 않은 포크로 끌어 오기를 원하는 새로운 끌어 오기 요청이 있습니다.

다른 포크에서 내 포크로 풀 요청을 적용하는 간단한 방법이 있습니까? 여기에 내가 놓친 다른 것이 있습니까?



git 명령을 사용하면 GitHub의 네트워크 그래프에 반영됩니까?
ADTC

또한 너무 모든 지점을 찾는 재미있을 수 있습니다 stackoverflow.com/q/47798937/10245
팀 아벨

답변:


276

수동으로 쉽게 할 수 있습니다.

  • 다른 포크를 리포지토리의 원격으로 추가하십시오.

    git remote add otherfork git://github.com/request-author/project.git
    
  • 그의 repo의 커밋을 가져옵니다

    git fetch otherfork
    
  • 풀 요청을 적용하는 두 가지 옵션이 있습니다 (선택 1을 선택하지 않으려는 경우).

    1. 오리진과 풀 요청 사이에 추가 된 최종 커밋을 적용하는 데 신경 쓰지 않는다면 풀 요청이 형성된 브랜치를 리베이스 할 수 있습니다.

      git rebase master otherfork/pullrequest-branch
      
    2. 풀 요청에서 커밋 만 원할 경우 SHA1을 식별하고 수행하십시오.

      git cherry-pick <first-SHA1> <second-SHA1> <etc.>
      

166
실제로, 체리 픽을 사용해서는 안되며, 새로운 커밋을 생성합니다. 그러면 풀 요청을 업스트림으로 보내면 혼란을 초래할 수 있습니다. 대신 pull 요청이 요청한 것처럼 병합해야합니다. 리모컨도 추가 할 필요가 없습니다. git pull URL branchname
Tekkub

3
@Tekkub : 새로 만든 커밋과 혼동을 피하는 것이 좋습니다. 병합하는 지점에서 다른 변경 사항을 가져올 수 있기 때문에 병합은 내 마음에 덜 우아합니다.
CharlesB

8
예, 그러나이 경우 그는 풀 요청을 포크로 가져 오는 방법을 구체적으로 물었습니다. 당겨 == 병합.
Tekkub

1
@CharlesB는 GitHub가 동일한 브랜치에 새로운 커밋을 자동으로 풀 요청에 추가하기 때문에 "다른 변경 사항"을 얻는 것이 어렵지 않습니다 (요청자가 모범 사례를 따르고 지속적인 개발과 별도의 브랜치에 변경 사항을 적용한다고 가정) 풀 커밋의 일부만 원할 때가 아닌 한 모든 커밋이 관련이 있습니다 .
neverfox

4
내 정신적 결함을 공유하는 사람들에게 "otherfork"는 원래 저장소를 참조하지 않고 풀 요청을 발행 한 포크에서 원래 저장소로 커밋을 참조합니다 . 원래 리포지를 무시하고 풀 요청을 한 포크로 직접 이동하십시오. 풀이 참조하는 커밋을 수동으로 풀하고 자신의 커밋을 병합하려고합니다.
Michael Khalili

282

업데이트 : 웹 페이지를 통해

github 웹 페이지를 통해이 작업을 수행 할 수도 있습니다.

나는 당신이 이미 관심 있는 포크 ( ) 로부터 보류중인 풀 요청을 가지고있는 MyFork일반적인 repo ( BaseRepo) 의 포크 ( )를 가지고 있다고 가정합니다 OtherFork.

  1. 포크 ( OtherFork)로 가져 오려는 풀 요청을 시작한 포크 ( MyFork) 로 이동하십시오.
  2. 풀 요청 페이지로 이동 OtherFork
  3. 새 풀 요청을 클릭하십시오
  4. 보류중인 풀 요청이 제공되어야합니다. 적절한 OtherFork지점도 선택해야합니다 . 왼쪽 포크를 포크 ( MyFork) ( 중요 )로 선택하십시오.
  5. 이제 옵션 View pull request이로 변경되어야합니다 Create pull request. 이것을 클릭하십시오.

이제 포크 ( MyFork) 에 보류중인 풀 요청이 있어야합니다 . 간단하게 수락 할 수 있습니다.


6
아름답게 작동합니다. cmd 줄보다 훨씬 간단하고 변경 사항을 쉽게 검토 할 수 있습니다. 감사합니다.
Alveoli

3
UI의 "OtherFork"에 도착하는 방법을 찾는 데 문제가있었습니다. 쉽게 도착하려면 github username으로 URL을 수정하십시오. 즉 github.com/userName/repoName
Charles

2
4 단계에서 언급 한 보류중인 풀 요청을 볼 수 없었습니다. 대신 OtherFork오른쪽 '비교'드롭 다운에서에서 만든 풀 요청에 해당하는 분기를 선택 했습니다. 그런 다음 풀 요청을 만들 수있는 것처럼 왼쪽을 기본 포크로 선택했습니다.
seddonym

포크가 없으면 작동합니다. 예 : github.com/OculusVR/RakNet/pull/61/files
Milan Babuškov

1
githubs 사이트의 정확한 단어가 오래되었지만 프로세스가 시작되었습니다. 매우 간단합니다-감사합니다!
kevnk

73

Tekkub가 이전에 말했듯이 지점을 직접 가져올 수 있습니다. GitHub를 사용하는 대부분의 경우 지점은 요청하는 사용자의 프로젝트 포크에서 단순히 "마스터"입니다.

예: git pull https://github.com/USER/PROJECT/ BRANCH

그리고 실제적인 예로서 :

safaribooks라는 github 프로젝트를 분기하고 원래 프로젝트에서 포크에 넣고 자하는 다음 풀 요청이 있다고 가정하십시오.

여기에 이미지 설명을 입력하십시오

그런 다음 포크의 복제 된 프로젝트 폴더에서 다음을 실행하십시오.

git pull https://github.com/fermionic/safaribooks.git fix-str-decode

20
이것의 단점은 브랜치가 풀 요청 외에 다른 것을 가질 수 있다는 것입니다. 또한 끌어 오기 요청 작성자의 포크에 적합한 URL을 찾아야합니다. 하나의 라이너를 사용하려면 git pull https://github.com/{upstream/project} refs/pull/{id}/head대신 사용하는 것이 좋습니다.
jbyler

1
@jbyler 브랜치에 다른 것들이 있다면 GitHub가 어쨌든 풀 요청을 업데이트했을 것이라고 확신합니다.
팀 말론

22

프로젝트에 대한 끌어 오기 요청은 여러 다른 작성자 (포크)의 요청 일 수 있으며 각 포크마다 별도의 리모콘을 원하지 않을 것입니다. 또한 풀 요청을 제출할 때 작성자가 사용한 브랜치 또는 작성자의 마스터 브랜치에 무엇이 있을지에 대해 어떤 가정도하고 싶지 않습니다. 따라서 다른 포크에 표시되는 것이 아니라 업스트림 저장소에 표시되는 풀 요청을 참조하는 것이 좋습니다.

1 단계:

git remote add upstream <url>

이미이 단계를 수행했을 수도 있지만 그렇지 않은 경우 업스트림 프로젝트에 대해 원격을 정의해야합니다. URL은 분기 한 프로젝트의 복제 URL입니다. 에서 더 많은 정보 포크에 대한 원격 구성포크를 동기화 . upstream리모컨에 부여한 이름이며, 다른 이름 일 수도 있지만 upstream일반적인 이름입니다.

2 단계:

git pull upstream refs/pull/{id}/head

... {id}풀 요청 번호는 어디에 있습니까 ? upstream1 단계를 정확하게 수행 한 경우 "upstream"과 같이 가져올 리모콘의 이름입니다. URL 일 수도 있습니다.이 경우 1 단계를 건너 뛸 수 있습니다.

3 단계 :

병합 커밋에 대한 커밋 메시지를 입력하십시오. 풀 요청 번호, 수정되는 문제 및 간단한 설명과 함께 멋진 한 줄 요약을 제공하는 것이 좋지만 기본값을 유지할 수 있습니다.

Merge PR#42, fixing VIM-652, support for mapping arbitrary IDEA actions

또한 풀 요청이있는 로컬 브랜치를 만드는 변형이 포함 된 관련 답변 도 참조하십시오 . 그리고 마지막 변형 : git pull upstream refs/pull/{id}/head커밋을 로컬 FETCH_HEADgit log ..FETCH_HEADgit merge FETCH_HEAD
리포지토리로 가져 와서

리베이스 작업은 어떻게해야합니까? 따라서 풀 요청이 헤드에 있고 병합 버블을 피할 수 있습니까?
Michael Johnston

1
풀 요청 작성자가 자신의 저장소를 제거했기 때문에 이것이 필요한 솔루션이었습니다.
jswetzen

20

나를 위해 일한 더 자세한 정보.

분기 저장소에 대한 내 .git / config 파일은 다음과 같습니다.

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = false
[remote "origin"]
        url = git@github.com:litzinger/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
        rebase = true
[remote "source"]
        url = git://github.com/revolunet/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/source/*
        fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

그런 다음 "git fetch source"를 실행하면 포크 리포지토리의 모든 풀 요청이 나열됩니다.

 * [new ref]         refs/pull/54/head -> origin/pr/54
 * [new ref]         refs/pull/67/head -> origin/pr/67
 * [new ref]         refs/pull/69/head -> origin/pr/69
 * [new ref]         refs/pull/71/head -> origin/pr/71

그런 다음 특정 풀 요청을 병합하려면 "git merge master origin / pr / 67"을 실행하십시오.


1
.git / config를 편집하고 [remote "source"] 줄을 추가했지만 관심이있는 프로젝트를 위해 지침이 완벽하게 작동했습니다. 나는이 답변을 좋아한다.
philo vivero

3
우수한 관련 조언에서 찾을 수 있습니다 news.ycombinator.com/item?id=9051220help.github.com/articles/checking-out-pull-requests-locally 읽기 전용이 (멋진) GitHub의 별에서 힌트 원격 refs/pull/네임 스페이스 .
Philip Durbin

당신이 Smartgit을 사용하는 경우 추가하면 당신은 로그 그래프에서 이러한 풀 요청 (및 폐쇄 사람)을 볼 수 smartgit.branch.otherRefs=notes;pull에 따라 smartgit.properties에 syntevo.com/doc/display/SG/System+Properties - 당신은 또한 그들을 병합 할 수 있습니다 .
CAD bloke

BTW, 당신은 또한 가져 자식 명령 행에 그것을 시도 할 수 있습니다 소스 + 심판 / 헤드 / * : 심판 / 리모트 / 상향 / * + 심판 / 풀 / * / 머리 : 심판 / 리모트 / 원산지 / 홍보 / *
LIB

9

내가 할 일은 다음과 같습니다.

git checkout master
git remote add #NAME# #ADDRESS TO REPO#
git fetch #USERNAME#
git checkout -b test_fork
git rebase #NAME#/#BRANCH#

이제 변경 사항을이라는 테스트 브랜치에 병합했습니다 test_fork. 따라서 변경 사항이 내 나무를 더럽 히지 않습니다.

선택적으로 위에 설명 된대로 체리 픽을 사용하여 더 바람직한 경우 특정 커밋을 선택할 수 있습니다.

행복한 여행 :)


0

나는 이것을 위해 편리한 멋쟁이 스크립트를 사용합니다. 다음을 입력하여 스크립트를 실행합니다.

git prfetch upstream

업스트림 포크에서 모든 풀 요청을 가져옵니다.

스크립트를 만들려면 파일을 만드십시오 ~/bin/git-prfetch.

파일에는 다음이 포함되어야합니다.

#!/bin/bash

if [ -z "$1" ]; then
    echo "Please supply the name of a remote to get pull requests from."
    exit 1
fi

git fetch $1 +refs/heads/\*:refs/remotes/$1/\* +refs/pull/\*/head:refs/remotes/$1/pr/\*

다음을 설정하여 경로에 스크립트가 포함되어 있는지 확인하십시오.

export PATH="$HOME/bin:$PATH"

이 파일을 추가 ~/.bashrc하여 변경 사항을 영구적으로 만들 수 있습니다.

이제 풀 요청을 받으려는 포크를 추가하십시오.

git remote add upstream https://github.com/user/repo.git

그리고

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