Jak wykonać żądanie ściągnięcia GitHub

283

Jak utworzyć i / lub wysłać żądanie ściągnięcia do innego repozytorium hostowanego na GitHub?

Tim Peterson
źródło
2
Czy nie jest to wystarczająco wyjaśnione na stronach pomocy GitHub ?
lanzz
27
@lanzz Nie, strona pomocy nie zawiera kilku użytecznych wskazówek, które chciałbym wiedzieć przed wykonaniem moich pierwszych żądań ściągnięcia (patrz poniżej).
VCC
9
@ianzz oczywiście strona Github jest „wystarczająca”, ale istnieje wiele sposobów uczenia się. Chciałem zrobić samouczek na poziomie dla początkujących. W wyjaśnieniu Githuba brakowało mi tego, że: 1) nie było zawarte w jednym źródle (dwie strony, które nie są wyraźnie połączone), 2) nie było zwięzłe (te strony są bardzo długie, długie = przytłaczające), 3) było nie wyjaśnione w kategoriach ludzkich w kluczowych sekcjach. Podczas nauczania bardziej doświadczonemu nauczycielowi zawsze trudno jest wiedzieć, czego początkujący nie wie. Moim celem było napisanie tego w butach dla początkującego.
tim peterson
12
Długie może oznaczać przytłaczające, co może oznaczać przerwanie = brak uczenia się. Można „w końcu zrozumieć rozumiany proces” wieloma drogami, które oczywiście nie byłyby jedną z nich. Aby zakończyć wojnę z płomieniem, nie trzeba odpowiadać, rozumiem skąd pochodzisz.
tim peterson
8
Żądasz ściągnięcia z własnego widelca. To zdecydowanie nie było moje pierwotne założenie.
Derek Illchuk

Odpowiedzi:

236

(Oprócz oficjalnej strony „ Pomoc GitHub” Korzystanie z żądań ściągania ”,
zobacz także„ Rozwidlenie kontra rozgałęzienie w GitHub ”,„ Jaka jest różnica między początkiem a początkiem w GitHub ”)

Kilka wskazówek na temat wniosków o pociągnięcie:

Zakładając, że najpierw rozwidliłeś repozytorium , oto, co powinieneś zrobić w tym posiadaniu:

  • utwórz gałąź : izoluj swoje modyfikacje w gałęzi. Nie twórz prośby ściągania, z masterktórej możesz mieć ochotę gromadzić i mieszać kilka modyfikacji na raz.
  • rebase tej gałęzi : nawet jeśli już wykonałeś żądanie ściągnięcia z tej gałęzi, ponowne umieszczenie go na wierzchu origin/master(upewniając się, że łatka nadal działa) zaktualizuje żądanie ściągnięcia automatycznie (nie musisz niczego klikać)
  • zaktualizuj tę gałąź : jeśli twoje żądanie ściągnięcia zostanie odrzucone, możesz po prostu dodać nowe zatwierdzenia i / lub całkowicie przywrócić swoją historię: ponownie aktywuje twoje istniejące żądanie ściągnięcia.
  • „skoncentruj się” na tej gałęzi : tzn. spraw, aby jej temat był „ścisły”, nie modyfikuj tysięcy klas i całej aplikacji, tylko dodawaj lub naprawiaj dobrze zdefiniowaną funkcję, utrzymując niewielkie zmiany .
  • usuń tę gałąź : po zaakceptowaniu możesz bezpiecznie usunąć tę gałąź na rozwidleniu (i git remote prune origin). GUI GitHub zaproponuje ci usunięcie swojego oddziału na stronie żądania ściągania.

Uwaga: aby napisać sam wniosek Pull-Request, zobacz „ Jak napisać idealne żądanie Pull ” (styczeń 2015, GitHub)


Marzec 2016: Nowa opcja przycisku scalania PR: patrz „ Zgadza się squash Github z interfejsu internetowego na żądanie ściągnięcia po komentarzach? ”.

zdusić

Opiekun repo może wybrać merge --squashte PR.


Po zgłoszeniu prośby

Jeśli chodzi o ostatni punkt, od 10 kwietnia 2013 r. „ Przeprojektowany przycisk scalania ” gałąź jest dla ciebie usuwana:

nowy przycisk scalania

Uproszczono także usuwanie oddziałów po scaleniu.
Zamiast potwierdzać usunięcie dodatkowym krokiem, natychmiast usuwamy gałąź po jej usunięciu i udostępniamy wygodny link do przywrócenia gałęzi w razie potrzeby .

Potwierdza to najlepszą praktykę usuwania oddziału po scaleniu żądania ściągnięcia.


pull-request vs. request-pull

  • żądanie ściągnięcia nie jest oficjalnym terminem „git”.
    Git używa polecenia request-pull(!)
    Do zbudowania żądania scalenia:
    „podsumowuje zmiany między dwoma zatwierdzeniami standardowego wyjścia i dołącza podany adres URL do wygenerowanego podsumowania”.
    Github wprowadza własną wersję od pierwszego dnia (luty 2008 r.) , Ale przeprojektował tę funkcję w maju 2010 r. , Stwierdzając, że:

    Pull Request = Compare View + Issues + Commit comments
    

e-notatki dla „reposotory” (sic)

<humour>

To (żądanie ściągnięcia) nie jest nawet poprawnie zdefiniowane przez GitHub!

Na szczęście prawdziwa organizacja wiadomości biznesowych wiedziałaby o tym, i jest e-notatka, która zastąpi pull-replace przez „e-note” :

https://pbs.twimg.com/media/BT_5S-TCcAA-EF2.jpg:large

Jeśli tak repo O Tory potrzebuje e-note ... zapytać Fox Biznes . Oni wiedzą.

</humour>

VonC
źródło
2
- @ VonC dzięki za to. Czy mógłbyś podać jakiś kod, aby wskazać, jak to, co powiedziałeś różni się od tego, co powiedziałem? branchVs. masterdecyzja wydaje się być krytyczna dla biorąc moją / odpowiedź GitHub jest z roztworu teoretycznej do czegoś, co można by właściwie wykorzystać.
tim peterson
1
@timpeterson fakt, że możesz całkowicie zmienić historię w tym oddziale i że automatycznie zaktualizuje żądanie ściągnięcia, jest tutaj kluczowy: ponieważ żądanie ściągnięcia musi zostać wykonane w najnowszym projekcie podrzędnym. Jeśli to repozytorium nadrzędne ma nowe zatwierdzenia, musisz zmienić na nim swój oddział (zmieniając historię tego oddziału) i zepchnąć go z powrotem do rozwidlenia: automatycznie zaktualizuje twoje żądanie ściągnięcia (w oparciu o ten sam oddział).
VCC
4
Nie rozumiem części opartej na zmianie. Co to robi (na tej stronie brzmi to jak nauka o rakietach, ale wierzę, że tak nie jest). Jakie polecenie wydalibyście w tym momencie, aby „rebases”?
Camilo Martin
1
@CamiloMartin, jeśli jesteś w swoim oddziale PR, to naprawdę git pull --rebase upstream/masterjest w porządku.
VonC
1
@vikramvi master to gałąź wspólna z pierwotnym repozytorium, które rozwidliłeś. Ta gałąź powinna zawsze odzwierciedlać oryginalne repo. Izolujesz swoje poprawki w oddziale dla twojego PR. Używasz master tylko jako sposobu, aby dowiedzieć się, co jest w oryginalnym repozytorium (i aby na nim umieścić bazę poprawek, aby zapewnić łatwe scalenie żądania ściągnięcia)
VonC
202

Aby dowiedzieć się, jak złożyć prośbę o ściągnięcie, po prostu podążyłem za dwiema oddzielnymi stronami pomocy na Github (linkami poniżej) Następujące polecenia wiersza poleceń dotyczą części 1 . Część 2 , rzeczywista prośba ściągnięcia, jest wykonywana całkowicie na stronie internetowej Github.

$ git clone https://github.com/tim-peterson/dwolla-php.git
$ cd dwolla-php
$ git remote add upstream https://github.com/Dwolla/dwolla-php.git
$ git fetch upstream
// make your changes to this newly cloned, local repo 
$ git add .
$ git commit -m '1st commit to dwolla'
$ git push origin master
  • Część 1 : rozwidlaj czyjeś repo: https://help.github.com/articles/fork-a-repo

    1. kliknij przycisk „rozwidlenia” na repozytorium, do którego chcesz przyczynić się, w tym przypadku: Repozytorium PHP Dwolla (Dwolla / dwolla-php)
    2. pobierz adres URL nowo utworzonego widelca, w tym przypadku: https://github.com/tim-peterson/dwolla-php.git (tim-peterson / dwolla-php)
    3. wpisz git clone->cd dwolla-php->git remote->git fetchpowyższą sekwencję, aby sklonować widelec gdzieś w komputerze (tzn. „skopiuj / wklej” go, w tym przypadku third_party TimPeterson$:) i zsynchronizuj go z master repo (Dwolla / dwolla-php)
    4. wprowadź zmiany w lokalnym repozytorium
    5. wpisz git add->git commit->git pushpowyższą sekwencję, aby przekazać zmiany do zdalnego repozytorium, tj. rozwidlenia na Github (tim-peterson / dwolla-php)
  • Część 2 : złóż wniosek ściągający: https://help.github.com/articles/using-pull-requests

    1. przejdź do strony widelca na Github ( https://github.com/tim-peterson/dwolla-php )
    2. kliknij przycisk „pull-request”
    3. nadaj nazwę pull-request, wpisz szczegóły dokonanych zmian, kliknij przycisk Prześlij.
    4. Jesteś skończony!!
Tim Peterson
źródło
4
- @ alexgray, zostawiłem monity bash, np. Tims-MacBook-Pro:third_party TimPeterson$ponieważ jest to tutorial dla początkujących i te monity pomagają zorientować użytkownika.
tim peterson
1
Tak. Dziękuję Ci. Roboczy przykład, za którym mogę podążać. Dlaczego nie masz tego git hub?
Sevenearths,
Potem git fetch upstream, czy nie musisz scalać wcześniejszych zmian z lokalną kopią, używając git checkout masterwtedy git merge upstream/master?
Sparhawk
@Sparhawk Nie, nie musisz scalać swoich zmian w master, który znajduje się w twoim widelcu. Żądanie ściągnięcia do drugiego repozytorium może być oparte wyłącznie na oddziale. Jednak zwykle dobrą praktyką jest również aktualizowanie elementu głównego swojego widelca, tak aby zmiany w „prawdziwym” repozytorium i często przywracane były w pętli w repozytorium.
ely
1
@HimanshuShekhar tak, ale musisz użyć aplikacji komputerowej github lub jej interfejsu API. Przeglądarka jest dla mnie łatwiejsza.
tim peterson
70

Aby złożyć żądanie ściągnięcia, wykonaj następujące czynności:

  1. Rozwidlaj repozytorium (do którego chcesz złożyć żądanie ściągnięcia). Po prostu kliknij przycisk rozwidlenia na stronie repozytorium, a będziesz mieć osobne repozytorium github poprzedzone twoją nazwą użytkownika github.
  2. Sklonuj repozytorium na maszynę lokalną. Oprogramowanie Github zainstalowane na komputerze lokalnym może to zrobić za Ciebie. Kliknij przycisk klonowania obok nazwy repozytorium.
  3. Wprowadź lokalne zmiany / zmiany w plikach
  4. zsynchronizuj zmiany
  5. przejdź do rozwidlonego repozytorium github i kliknij zielony przycisk „Porównaj i przejrzyj” obok przycisku gałęzi. (Przycisk ma ikonę - bez tekstu)
  6. Otworzy się nowa strona pokazująca twoje zmiany, a następnie kliknij link żądania ściągnięcia, który wyśle ​​żądanie do pierwotnego właściciela utworzonego przez Ciebie repozytorium.

Zajęło mi to trochę czasu, mam nadzieję, że to komuś pomoże.

Farhan
źródło
3
Nie było dla mnie jasne, że musisz przygotować repozytorium, zanim będziesz mógł złożyć prośbę. Uznałem, że wypychane zatwierdzenie po prostu przejdzie do jakiegoś oczekującego oddziału, który ma publiczny dostęp do zapisu, a następnie połączy się. Dzięki!
Chris Arena
16

Rozpocząłem projekt, aby pomóc ludziom składającym pierwsze żądanie ściągnięcia z GitHub. Możesz zrobić praktyczny samouczek, aby zrobić swój pierwszy PR tutaj

Przepływ pracy jest prosty jak

  • Rozwidlaj repo w github
  • Uzyskaj adres URL klonowania, klikając przycisk klonowania repo
  • Idź do terminalu i biegnij git clone <clone url you copied earlier>
  • Utwórz gałąź dla wprowadzanych zmian git checkout -b branch-name
  • Wprowadź niezbędne zmiany
  • Zatwierdź zmiany git commit
  • Wrzuć zmiany do swojego widelca na GitHub git push origin branch-name
  • Przejdź do swojego widelca na GitHub, aby zobaczyć Compare and pull requestprzycisk
  • Kliknij na nią i podaj niezbędne szczegóły
Sudo Bangbang
źródło
15

Dla tych z nas, którzy mają konto github.com, ale otrzymują nieprzyjemny komunikat o błędzie, gdy wpisujemy „git” w wierszu polecenia, oto jak to zrobić w przeglądarce :)

  1. Tak jak napisali Tim i Farhan: Rozwidlaj własną kopię projektu: Krok 1: Widelec
  2. Po kilku sekundach nastąpi przekierowanie do własnej rozwidlonej kopii projektu: Krok 2
  3. Przejdź do plików, które chcesz zmienić, i kliknij „Edytuj ten plik” na pasku narzędzi: Krok 3: Edytuj plik
  4. Po edycji napisz kilka słów opisujących zmiany, a następnie „Zatwierdź zmiany”, równie dobrze do gałęzi master (ponieważ jest to tylko twoja kopia, a nie „główny” projekt). Krok 4: Zatwierdź zmiany
  5. Powtórz kroki 3 i 4 dla wszystkich plików, które musisz edytować, a następnie wróć do katalogu głównego kopii projektu. Tam kliknij zielony przycisk „Porównaj, przejrzyj ...”: Krok 5: Rozpocznij przesyłanie
  6. Na koniec kliknij „Utwórz prośbę pull” ..i następnie „Utwórz prośbę pull” ponownie po tym, jak dwukrotnie sprawdzane nagłówek Twoją prośbę i opis: wprowadź opis zdjęcia tutaj
Sphinxxx
źródło
3

Postępowałem zgodnie z instrukcjami Tima Petersona, ale utworzyłem lokalny oddział dla moich zmian. Jednak po wypchnięciu nie widziałem nowego oddziału w GitHub. Rozwiązaniem było dodanie -u do polecenia push:

git push -u origin <branch>
tamalet
źródło
zauważyłeś 2 nazwy użytkowników w powyższym adresie URL? pierwszy to tim-petersondrugiDwolla
tim peterson,
3
To również lepiej jako komentarz do mojej odpowiedzi. Możesz dostać trochę głosów negatywnych.
tim peterson
1

Napisałem program bash, który wykonuje całą pracę związaną z tworzeniem dla ciebie gałęzi PR. Wykonuje rozwidlanie w razie potrzeby, synchronizuje się z nadrzędnym, konfiguruje zdalny nadrzędny itp. I wystarczy zatwierdzić modyfikacje, wcisnąć i przesłać PR.

Oto jak go uruchomić:

github-make-pr-branch ssh your-github-username orig_repo_user orig_repo_name new-feature

Znajdziesz tutaj program , a jego repozytorium zawiera także przewodnik krok po kroku dotyczący ręcznego wykonywania tego samego procesu, jeśli chcesz zrozumieć, jak to działa, a także dodatkowe informacje o tym, jak utrzymać gałąź funkcji na bieżąco - umówić się z głównym mistrzem i innymi przydatnymi ciekawostkami.

kamieniarz
źródło
0

Najprostszy GitHub Pull Zapytanie jest za pomocą interfejsu WWW bez użycia git.

  1. Zarejestruj konto GitHub, zaloguj się, a następnie przejdź do strony w repozytorium, które chcesz zmienić.
  2. Kliknij ikonę ołówka ,

    wyszukaj tekst w pobliżu lokalizacji, wprowadź odpowiednie zmiany, a następnie wyświetl ich podgląd, aby potwierdzić. Podaj proponowanej zmianie opis do 50 znaków i opcjonalnie rozszerzony opis, a następnie kliknij przycisk Proponuj zmianę pliku .

  3. Jeśli to czytasz, nie będziesz mieć dostępu do zapisu w repozytorium (folderach projektu), więc GitHub utworzy kopię repozytorium (w rzeczywistości oddziału) na Twoim koncie. Kliknij przycisk Utwórz żądanie ściągnięcia .

  4. Podaj opis żądania ściągnięcia i dodaj wszelkie komentarze, a następnie kliknij przycisk Utwórz żądanie ściągnięcia .
Flywire
źródło