Jak otworzyć wiele żądań ściągnięcia w GitHub


139

Kiedy otwieram żądanie ściągnięcia w GitHub .
Wszystkie zatwierdzenia od mojego ostatniego żądania i wszystkie nowe są automatycznie dodawane do tego żądania .

Nie mogę kontrolować, które zatwierdzenia są dodawane, a które nie.
Kiedy próbuję otworzyć kolejne żądanie ściągnięcia, pojawia się błąd „Ups! Jest już żądanie ściągnięcia”.

Czy istnieje łatwy sposób na otwarcie wielu żądań ściągnięcia bez konieczności majstrowania przy linii poleceń?

Odpowiedzi:


116

Żądania ściągnięcia są oparte na gałęzi.
Jedynym sposobem otwarcia żądania ściągnięcia dla wielu zatwierdzeń jest:

  1. Izoluj ich we własnej gałęzi .
  2. Otwórz stamtąd żądania ściągnięcia.

3
Ok, fajnie, myślałem, że to tylko z mistrzem. Więc masz na myśli to, że mogę stworzyć wiele gałęzi (tj .: funkcje git flow) i wysyłać żądania ściągnięcia dla każdego z nich ... Zamierzam spróbować!
Ziyan Junaideen

8
Właśnie odkryłem, że gałąź zachowała historię poprzednich zatwierdzeń, więc pull request skierowany do upstream nadal zawiera wszystkie zatwierdzenia.
eel ghEEz

2
Cześć @ eel-gheez, czy wiesz, co z tym zrobić? Jak tworzyć izolowane PR bez pokazywania zmian z innych branż?
Jonathan Cross

3
To nie rozwiązuje problemu: kiedy próbuję utworzyć PR, porównywane są obie gałęzie (z co najmniej jednym zatwierdzeniem każda). Co ja robię źle?
MERose

1
@eelghEEz Powinieneś utworzyć nową gałąź, git cherry-wybrać wszystkie zatwierdzenia, które chcesz do tej gałęzi, a następnie wykonać żądanie ściągnięcia z tej gałęzi. Bardzo ważną cechą projektową git jest to, że każde zatwierdzenie zależy od poprzedniego zatwierdzenia, a zatwierdzenia w git nie powinny być traktowane jako zwykła łata, ale jako łatka, która wie, która łata została wcześniej zastosowana. Dlatego właśnie należy stworzyć nową gałąź z nowymi zatwierdzeniami, których różnice mogą być nadal takie same, ale których linki do poprzednich zatwierdzeń są różne.
MD

11

Najłatwiejszym sposobem, w jaki udało mi się to zrobić, jest użycie polecenia hub ( https://github.com/defunkt/hub ).

Z gałęzi tematycznej („funkcja” w tym przykładzie), dla której chcesz utworzyć żądanie ściągnięcia, możesz po prostu uruchomić:

git pull-request

(pamiętaj, aby najpierw przesunąć gałąź!)

I otworzy nowe żądanie ściągnięcia w GitHub dla „YOUR_USER: feature”.

Jeśli utworzyłeś już problem w GitHub, możesz nawet dołączyć żądanie ściągnięcia do istniejącego problemu (coś, czego nie możesz zrobić z interfejsu internetowego):

$ git pull-request -i 123
[ attached pull request to issue #123 ]

2

W rzeczywistości MOŻESZ to zrobić bez tworzenia kolejnej gałęzi, ale wymaga to trochę zabawy.
Oto kroki:

  1. Zidentyfikuj dwa zakresy zatwierdzeń, które chcesz pobrać. Oto, czego użyję na przykładzie:
    (inny / mistrz) A -> B -> C -> D -> E (twój / mistrz)
    Powiedzmy, że chcesz wyciągnąć B i C w jednym żądaniu, a D & E w innym.
  2. Złóż żądanie ściągnięcia. Poproś o zatwierdzenie lewej strony („Podstawa”) A. Dla prawej strony („nagłówka”) wpisz numer zatwierdzenia C.
  3. Napisz opis swojej pierwszej prośby.
  4. Złóż kolejną prośbę. Dla podstawy wpisz numer zatwierdzenia C, a dla głowy wpisz E (twoje / mistrz).
  5. Napisz opis.

Jak widzę, żądanie ściągnięcia traktuje zatwierdzenie C jako punkt rozgałęzienia. Lub coś.


Musisz pozostawić inny / master jako lewą stronę, nawet jeśli dodajesz numer zatwierdzenia od swojego / mistrza. Również ta metoda nie pozwala na dodawanie nowych zatwierdzeń do żądania scalenia, na wypadek gdyby potrzebne były dalsze zmiany.
frisco

Opublikowałem swego rodzaju uzupełnienie tej odpowiedzi, w przeciwieństwie do niektórych informacji na Github, patrz stackoverflow.com/questions/23159860
Mark Bennett

Widzę, że stworzyłoby to dwa PR, które wyglądają poprawnie, ponieważ każdy z nich zawierałby dokładnie pożądane zatwierdzenia. Ale mówiąc wprost, czy robi to dobrze, gdy się łączą? Tak jak w, widzę, że pierwszy PR poprawnie połączyłby B & C z innym / master. Ale kiedy 2. PR się połączy, skąd będzie wiedzieć, z którą gałęzią się połączyć? (Ponieważ został utworzony na zatwierdzeniu „C”, a nie na innym / głównym) Czy ma znaczenie, w jakiej kolejności zostaną scalone PR? (prawdopodobnie tak)
Jonathan Hartley

1

Kiedy początkowo przechodzisz do tworzenia żądania ściągnięcia, jeśli otworzysz dwa oddzielne formularze dla nowego żądania ściągnięcia, pozwoli ci to utworzyć je, o ile są wskazywane na różne gałęzie do scalenia. Na przykład, mógłbym utworzyć dwa oddzielne Żądania, jeden w celu połączenia z głównym, a drugi w celu połączenia w test.


1

Jestem nowy w Git i GitHub i miałem to samo pytanie co OP.

Znalazłem rozwiązanie, które prawdopodobnie nie było dostępne w czasie PO.

Sytuacja: masz 3 zmiany i chcesz, aby każda z nich była zbudowana na podstawie poprzedniej i każda miała własne żądanie ściągnięcia (PR).

Problem: Kiedy tworzysz pierwszy PR, który próbuje wciągnąć program do mastera, wszystko wygląda dobrze, ale potem po wprowadzeniu zmian dla drugiego PR i scaleniu ich (przy użyciu tej samej gałęzi) wszystkie zmiany są w tym samym PR .

Mini rozwiązanie: Utwórz nową gałąź

git branch mini_change_2
git checkout mini_change_2

Teraz wysyłasz kod do GitHub i tworzysz PR, ale domyślnie jest to Pull from mini_change_2 do master, z wyjątkiem tego, że master nie ma jeszcze zmian z pierwszego PR, więc zawiera wszystkie zmiany z PR1 i PR2.

Najlepsze rozwiązanie: Określ gałąź, do której chcesz się scalić w PR2.

Nie akceptuj tylko wartości domyślnych podczas tworzenia drugiego PR, powiedz, że zamierzasz przeciągnąć mini_chnage_2 do Develop, to pokaże tylko zmiany w mini_change_2

Teraz utwórz nową gałąź mini_change_3 i PR, która zostanie utworzona na mini_change_3.

Problem pojawia się, gdy zaczniesz je scalać ... ale to jest inne ćwiczenie.

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.