Jak zastosować do mojego widelca nie połączone ze sobą żądania ściągania z innych widelców?


465

Projekt na GitHub, do którego mam rozwidlenie, zawiera nowe żądania ściągania, które chcę wciągnąć do rozwidlenia, których autor jeszcze nie ściągnął.

Czy istnieje prosty sposób zastosowania żądania ściągania z innych widelców do mojego widelca? Czy brakuje mi czegoś jeszcze?



Czy to odzwierciedla wykres sieci w GitHub, jeśli używasz do tego poleceń git?
ADTC

Interesujące może być również znalezienie wszystkich gałęzi: stackoverflow.com/q/47798937/10245
Tim Abell,

Odpowiedzi:


276

Możesz to zrobić ręcznie dość łatwo:

  • dodaj drugi widelec jako pilot swojego repozytorium:

    git remote add otherfork git://github.com/request-author/project.git
    
  • pobierz jego repozytorium

    git fetch otherfork
    
  • Masz dwie opcje zastosowania żądania ściągnięcia (jeśli nie chcesz wybierać 1.)

    1. Jeśli nie zależy ci na zastosowaniu ewentualnych zatwierdzeń, które zostały dodane między początkiem a żądaniem ściągnięcia, możesz po prostu zmienić podstawę gałęzi, na której utworzono żądanie ściągnięcia

      git rebase master otherfork/pullrequest-branch
      
    2. Jeśli chcesz tylko zatwierdzeń w żądaniu ściągnięcia, zidentyfikuj ich SHA1 i zrób

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

166
W rzeczywistości nie powinieneś używać cherry-pick, ponieważ tworzy on nowe zatwierdzenia ... co z kolei spowoduje zamieszanie, jeśli wyślesz żądanie ściągnięcia w górę. Zamiast tego powinieneś scalić tak, jak prosi o to żądanie ściągania. Nie musisz też dodawać pilota. git pull URL branchname
Tekkub

3
@Tekkub: zgadzam się, może lepiej unikać pomyłek z nowo utworzonymi zatwierdzeniami. Scalanie jest moim zdaniem mniej eleganckie, ponieważ możesz wprowadzić inne zmiany z gałęzi, z którą się łączysz
CharlesB

8
Tak, ale w tym przypadku konkretnie zapytał, jak wyciągnąć żądanie ściągnięcia do swojego widelca. Pociągnij == scal.
Tekkub

1
@CharlesB, ponieważ GitHub automatycznie dodaje nowe zatwierdzenia w tym samym oddziale do żądania ściągnięcia, nie byłoby trudno uzyskać jakiekolwiek „inne zmiany” (zakładając, że żądający postępuje zgodnie z najlepszymi praktykami i umieszcza zmiany w innym oddziale od dalszego rozwoju, więc że wszystkie zatwierdzenia są istotne), chyba że otrzymujesz tylko wtedy, gdy chcesz tylko część żądania ściągnięcia?
neverfox

4
Dla tych, którzy podzielają moje psychiczne usterki „otherfork” nie odwołuje się do oryginalnego repo, to odwołuje się do popełnienia z widełek, które wydane żądania ściągania do oryginalnego repo. Zignoruj ​​oryginalne repozytorium i przejdź bezpośrednio do widelca, który wysłał żądanie ściągnięcia. Chcesz ręcznie pobrać zatwierdzenie, do którego odnosiło się ściągnięcie i połączyć je z własnym.
Michael Khalili,

282

Aktualizacja: za pośrednictwem strony internetowej

Możesz to również zrobić na stronie github.

Zakładam, że powinieneś mieć już fork ( MyFork) wspólnej repo ( BaseRepo), która ma oczekujące żądanie ściągnięcia z fork ( OtherFork), które Cię interesują.

  1. Przejdź do fork ( OtherFork), który zainicjował żądanie ściągnięcia, które chcesz dostać się do fork ( MyFork)
  2. Przejdź do strony z prośbami o pobranie OtherFork
  3. Kliknij nowe żądanie ściągnięcia
  4. Oczekujące prośby o pociągnięcie powinny zostać zaoferowane. Pamiętaj, aby również wybrać odpowiednią OtherForkgałąź. Wybierz po lewej stronie jako widelec podstawy swojego widelca ( MyFork) ( WAŻNE ).
  5. Teraz opcja View pull requestpowinna zmienić się na Create pull request. Kliknij to.

Teraz powinieneś mieć oczekujące żądanie ściągnięcia w fork ( MyFork), które możesz po prostu zaakceptować.


6
Działa pięknie. Znacznie prostsza niż linia cmd i łatwa do przejrzenia zmiany. Dziękuję Ci.
Alveoli,

3
Miałem problem ze znalezieniem sposobu na przejście do „OtherFork” w interfejsie użytkownika. Aby łatwo się tam dostać, wystarczy zmodyfikować adres URL za pomocą nazwy użytkownika github. tj. github.com/userName/repoName
Charles

2
Nie byłem w stanie zobaczyć oczekujących żądań ściągnięcia wspomnianych w kroku 4. Zamiast tego wybrałem gałąź, która odpowiadała zgłoszonemu żądaniu ściągnięcia OtherFork, z menu rozwijanego „porównaj” z prawej strony. Następnie wybrałem lewą stronę jako podstawowy widelec, jak opisano powyżej, ponieważ byłem w stanie utworzyć żądanie ściągnięcia.
seddonym

Działa, chyba że nie ma widelca. Na przykład: github.com/OculusVR/RakNet/pull/61/files
Milan Babuškov

1
Dokładne słowa z witryny githubs mogą być nieaktualne, ale proces jest na miejscu. Super proste - dzięki!
kevnk

73

Jak powiedział wcześniej Tekkub, możesz po prostu wciągnąć gałąź bezpośrednio. Przez większość czasu w GitHub oddział jest po prostu „master” w widelcu projektu użytkownika, który go żąda.

Przykład: git pull https://github.com/USER/PROJECT/ BRANCH

I jako praktyczny przykład:

Załóżmy, że rozwidliłeś projekt github o nazwie safaribooks, a w projekcie źródłowym występuje następujące żądanie ściągnięcia, które chcesz umieścić w swoim widelcu:

wprowadź opis zdjęcia tutaj

Następnie w sklonowanym folderze projektu widelca uruchom:

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

20
Minusem tego jest to, że gałąź może zawierać inne rzeczy oprócz żądania ściągania. Ponadto należy sprawdzić poprawny adres URL widelca autora żądania ściągnięcia. Jeśli chcesz użyć jednowarstwowej, lepiej użyć git pull https://github.com/{upstream/project} refs/pull/{id}/headzamiast tego.
jbyler,

1
@jbyler Jeśli gałąź zawiera inne rzeczy, jestem pewien, że GitHub i tak zaktualizuje żądanie ściągnięcia.
Tim Malone,

22

Żądania ściągania dla projektu mogą pochodzić od wielu różnych autorów (widelców) i prawdopodobnie nie potrzebujesz osobnego pilota dla każdego widelca. Ponadto nie chcesz przyjmować żadnych założeń dotyczących gałęzi, której autor użył podczas przesyłania żądania ściągnięcia, ani tego, co jeszcze może znajdować się w głównej gałęzi autora. Dlatego lepiej jest odwoływać się do żądania ściągnięcia, tak jak pojawia się ono w repozytorium nadrzędnym, niż jak pojawia się w innych widłach.

Krok 1:

git remote add upstream <url>

Prawdopodobnie już zrobiłeś ten krok, ale jeśli nie, będziesz potrzebować pilota zdefiniowanego dla projektu nadrzędnego. Adres URL to klonowany adres rozwidlonego projektu. Więcej informacji na temat Konfigurowanie pilota do widelca i Synchronizowanie widelca . upstreamto nazwa, którą nadajesz pilotowi, i chociaż może być czymkolwiek, upstreamjest nazwą konwencjonalną.

Krok 2:

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

... gdzie {id}jest numer żądania ściągnięcia. upstreamto nazwa pilota, z którego należy pobierać, tj. „upstream”, jeśli dokładnie wykonałeś krok 1. Może to być również adres URL, w którym to przypadku możesz pominąć krok 1.

Krok 3:

Wpisz komunikat zatwierdzenia dla zatwierdzenia scalania. Możesz zachować wartość domyślną, chociaż zalecam podanie ładnego, jednowierszowego podsumowania z numerem żądania ściągnięcia, rozwiązanym przez niego problemem i krótkim opisem:

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

Zobacz także pokrewną odpowiedź z wariantem, który tworzy gałąź lokalną z żądaniem ściągnięcia. I ostatni wariant: możesz użyć, git pull upstream refs/pull/{id}/headaby wprowadzić zatwierdzenia do lokalnego repozytorium, a następnie odwołać się do nich jako FETCH_HEAD(np. git log ..FETCH_HEADAby zobaczyć, co tam jest git merge FETCH_HEAD)
jbyler,

jak miałbym przejść do bazowania, więc żądanie ściągnięcia jest na czele i mogę uniknąć bańki scalania?
Michael Johnston,

1
To było rozwiązanie, którego potrzebowałem, ponieważ autor żądania ściągnięcia usunął swoje repozytorium.
jswetzen,

20

Kilka bardziej szczegółowych informacji, które działały dla mnie.

Mój plik .git / config dla rozwidlonego repozytorium wygląda następująco:

[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/*

Następnie uruchom „git fetch source”, które wyświetliło wszystkie żądania ściągania z rozwidlonego repozytorium.

 * [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

A następnie, aby scalić w konkretnym żądaniu ściągania, uruchom „git merge master origin / pr / 67”


1
Zredagowałem moją .git / config i dodałem wiersze [zdalne „źródło”], ale dla projektu, którym byłem zainteresowany, instrukcje działały bezbłędnie. Uwielbiam tę odpowiedź.
philo vivero

3
Doskonałe pokrewne porady można znaleźć na news.ycombinator.com/item?id=9051220 i help.github.com/articles/checking-out-pull-requests-lokalnie wskazując na tę (niesamowitą) specyficzną dla GitHub zdalną refs/pull/przestrzeń nazw tylko do odczytu .
Philip Durbin

Jeśli używasz Smartgit, możesz zobaczyć te żądania ściągania (i te zamknięte) na wykresie dziennika, jeśli dodasz smartgit.branch.otherRefs=notes;pulldo smartgit.properties zgodnie z syntevo.com/doc/display/SG/System+Properties - możesz je również stamtąd scalić .
CAD CAD

btw, możesz również wypróbować go w wierszu poleceń za pomocą git fetch source + refs / heads / *: refs / remotes / upstream / * + refs / pull / * / head: refs / remotes / origin / pr / *
lib

9

To, co bym zrobił, to:

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

Teraz połączyłem zmiany w gałęzi testowej o nazwie test_fork. Aby wszelkie zmiany nie zabrudziły mojego drzewa.

Opcjonalnie możesz użyć cherry-pick, jak opisano powyżej, aby wybrać konkretny zatwierdzenie, jeśli jest to bardziej preferowane.

Szczęśliwe podróże :)


0

Używam do tego poręcznego skryptu Dandy. Uruchamiam skrypt, wpisując:

git prfetch upstream

i otrzymuje wszystkie żądania ściągania z górnego widelca.

Aby utworzyć skrypt, utwórz plik ~/bin/git-prfetch.

Plik powinien zawierać następujące elementy:

#!/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/\*

Upewnij się, że ścieżka zawiera skrypt, ustawiając:

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

Możesz dodać ten plik, ~/.bashrcaby zmienić na stałe.

Teraz upewnij się, że dodajesz widelec, z którego chcesz otrzymywać żądania ściągania:

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

I wtedy

git prfetch upstream
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.