Scal żądanie ściągnięcia z inną gałęzią niż domyślna w Github


122

Do mojego repozytorium hostowanego na Githubie przychodzi żądanie ściągnięcia. Domyślnie jest scalany do mastergałęzi.

Czy jest jakiś sposób, abym mógł zmienić gałąź, w której zmiany zostaną scalone?

Odpowiedzi:


86

Od 15.08.2016 GitHub umożliwia zmianę gałęzi docelowej żądania ściągnięcia za pośrednictwem GUI. Kliknij Editobok tytułu, a następnie wybierz gałąź z listy rozwijanej.

zrzut ekranu

Możesz teraz zmienić gałąź podstawową otwartego żądania ściągnięcia. Po utworzeniu żądania ściągnięcia można zmodyfikować gałąź podstawową, aby zmiany w żądaniu ściągnięcia były porównywane z inną gałęzią. Zmieniając gałąź podstawową oryginalnego żądania ściągnięcia zamiast otwierać nową z prawidłową gałęzią podstawową, będziesz w stanie zachować cenną pracę i dyskusję.


1
To powinna być prawidłowa odpowiedź na to pytanie (po aktualizacji do GitHub tj.).
stuxnetting

Wydaje się, że ta funkcja już nie istnieje (od 2018-02-15), prawda? W ostatnim żądaniu ściągnięcia gałąź docelowa jest wyświetlana tą samą niebieską czcionką na jasnoniebieskim tle co repozytorium / gałąź źródłowa i nie jest już przyciskiem.
cgogolin

12
Ach! To robi! Najpierw należy kliknąć „Edytuj” (co nie jest oczywiste na powyższym zrzucie ekranu). Przeoczyłem to. Przepraszam.
cgogolin

@cgogolin Dzięki za zwrócenie uwagi - ja też byłem zdezorientowany, dopóki nie przeczytałem Twojego komentarza i nie kliknąłem przycisku Edytuj.
mhucka

Github ostrzega, że „Kiedy zmienisz gałąź podstawową żądania ściągnięcia, niektóre zatwierdzenia mogą zostać usunięte z osi czasu”. i „Niektóre zatwierdzenia ze starej gałęzi bazowej mogą zostać usunięte z osi czasu”. Masz jakiś pomysł, co to oznacza?
Matthias Fripp

55

Przesyłający może to zmienić, gdy wyda żądanie ściągnięcia, ale po wydaniu nie można tego zmienić.

Z drugiej strony możesz ręcznie scalić ich gałąź i wypychać, co robię półregularnie w przypadku błędnie ukierunkowanych żądań ściągnięcia.

hubKlejnot może być pomocny w pracy z komponentami żądania ściągnięcia.

Ten klejnot zamyka proces ręczny, którym jest:

  1. Dodaj pilota do widelca do lokalnego kasy.
  2. Weź tego pilota.
  3. git checkout ${target_branch} && git merge ${remote}/${branch}
  4. git push origin ...

1
Jeśli ręcznie połączę i wypchnę, czy Github zda sobie sprawę, że żądanie ściągnięcia zostało skutecznie zakończone? Czy są jakieś wskazówki, jak scalić dane ze zdalnego oddzielnego repozytorium (rozwidlenia)?
eoinoc

3
Nie jestem pewien, ale nie bezpośrednio - ponieważ zmiana nie została scalona z gałęzią docelową, więc żądanie ściągnięcia nie zostało zakończone zgodnie z definicją. Musisz go ręcznie zamknąć. Co do wskazówek, zobacz zredagowany komentarz.
Daniel Pittman

Polecam użycie, git merge --no-ff ...jak wspomina @GuillermoMansilla w swojej odpowiedzi.
jjmontes

3
„Kiedy już go wydadzą, nie można tego zmienić” - od sierpnia 2016 r. Już nie! Zobacz odpowiedź @maliayas poniżej: stackoverflow.com/a/38985999/12484
Jon Schneider,

1
Postępowałem zgodnie z tą procedurą dzisiaj (3 marca 2017). Ściągnąłem żądanie ściągnięcia do innej gałęzi i wprowadziłem kilka dodatkowych poprawek, a następnie scaliłem do mastera. Gdy zatwierdzenia z żądania ściągnięcia zakończyły się w trybie głównym, GitHub automatycznie zamknął żądanie ściągnięcia.
Ivan Krivyakov

14

Alternatywą dla korzystania z klejnotu centrum wspomnianego w innych odpowiedziach jest użycie wiersza poleceń do lokalnego scalenia żądań ściągnięcia , co pozwala na:

$ git fetch origin
$ git checkout *target_branch*
$ git merge pr/XXX
$ git push origin *target_branch*

Powyższe polecenia działają bezpośrednio tylko wtedy, gdy najpierw dodasz następujący wiersz do .git/configpliku:

fetch = +refs/pull/*/head:refs/remotes/symbolic_name_origin_or_upstream/pr/*

Umożliwia to pobranie WSZYSTKICH żądań ściągnięcia. Ponieważ może to nie być pożądane w przypadku dużych repozytoriów, GitHub zmodyfikował instrukcje tak, aby zawierały git fetch origin pull/ID/head:BRANCHNAMEskładnię, co pozwala uniknąć modyfikacji pliku konfiguracyjnego i pobiera tylko to pojedyncze żądanie ściągnięcia.


8

Chociaż nie możesz zmienić istniejącego żądania ściągnięcia, ponieważ nie jest ono twoje, możesz łatwo utworzyć nowe, jeśli powiązane repozytorium źródłowe nadal istnieje - tak, nawet jeśli należy do kogoś innego.

Przejdź do repozytorium przesyłającego, a następnie utwórz nowe żądanie ściągnięcia w jego / jej repozytorium, używając tych samych zatwierdzeń, ale upewnij się, że poprawnie ustawiłeś właściwą gałąź docelową.

Następnie wróć do własnego repozytorium i zaakceptuj nowe żądanie ściągnięcia. Voila!


Czy to działa, jeśli zmienili swoje repozytorium? W jaki sposób można zapewnić, że są to „te same zatwierdzenia”?
ragerdl

@ragerdl - Jeśli tworzysz przy użyciu modelu „feature-per-branch”, możesz utworzyć PR z odgałęzieniem względem gałęzi upstream i powinien zawierać te same zatwierdzenia.
geerlingguy

2
Jedyny sposób, aby zrobić to bezpośrednio na GitHub, bez dostępu do lokalnego repozytorium.
kopischke

8

Nie ma nic złego w rozwiązaniu Daniela Pittmana, jednak te połączenia potraktowałbym jako „brak szybkiego przewijania do przodu”, czyli zmiana kroku numer 3 na:

git checkout ${target_branch} && git merge --no-ff ${remote}/${branch}

Używając --no-ff, historia będzie łatwiejsza do odczytania. Wyraźnie powie, że $npochodzą z zatwierdzeń $branch, a także ułatwi ci życie, jeśli będziesz musiał cofnąć coś, co zostało zrobione w tej gałęzi.

Aby również odpowiedzieć na pytanie eoinoc i udzielić dodatkowej wskazówki:

Po wykonaniu scalenia git cli poprosi Cię o napisanie wiadomości, generalnie pojawi się ogólna wiadomość o treści podobnej do

Scal oddział zdalnego śledzenia „użytkownik / jego gałąź” z twoim oddziałem

Pamiętaj, aby edytować ten komunikat i dołączyć odwołanie do numeru żądania ściągnięcia. To znaczy: (Zakładając, że numer żądania ściągnięcia to 123)

Scal oddział zdalnego śledzenia „użytkownik / jego gałąź” z twoim oddziałem

refs # 123 rozwiązując cokolwiek ...

Więc następnym razem, gdy odwiedzisz stronę problemów / żądań ściągnięcia na Github i sprawdzisz to konkretne żądanie ściągnięcia, zobaczysz swoją wiadomość z linkiem do zatwierdzenia miejsca, w którym dokonałeś scalenia.

Oto zrzut ekranu tego, co mam na myśli.

wprowadź opis obrazu tutaj


6

Aby to zrobić, przejdź do strony domowej repozytorium, kliknij na gałęzie i zmień domyślną gałąź z master na coś innego, w moim przypadku "dev".

Następnie, za każdym razem, gdy ktoś utworzy żądanie ściągnięcia, mergeprzycisk automatycznie połączy żądanie z "deweloperem" zamiast głównym.

wprowadź opis obrazu tutaj


dzięki za poprawkę literówki @ The Tin Man Doceniam to
abbood

4
Nie musisz nam dziękować za dostosowanie / edycję. Robimy to dla witryny. Piszcie dobre odpowiedzi, wystarczy.
Tin Man
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.