Pobierz nowe aktualizacje z oryginalnego repozytorium GitHub do rozwidlonego repozytorium GitHub


615

Rozwidliłem czyjeś repozytorium na GitHub i chciałbym zaktualizować moją wersję za pomocą zatwierdzeń i aktualizacji dokonanych w oryginalnym repozytorium. Zostały one wykonane po rozwidleniu kopii.

Jak mogę pobrać zmiany dokonane w źródle i włączyć je do mojego repozytorium?


1
Możliwe duplikaty, a może po prostu powiązane: Scalanie między widelcami w GitHub .

W przypadku dodatkowych tagów, które możesz chcieć zsynchronizować, wykonaj git push --force origin --tagsproponowane rozwiązania!
— MediaVince

Odpowiedzi:


716

Musisz dodać oryginalne repozytorium (to, które rozwidliłeś) jako zdalne.

Ze strony podręcznika użytkownika GitHub :

widelec

Po zakończeniu klonowania twoje repozytorium będzie miało pilot o nazwie „ origin”, który wskazuje na twój widelec na GitHub.
Nie daj się zwieść nazwie, nie oznacza to oryginalnego repozytorium, z którego rozwidliłeś się. Aby ułatwić śledzenie tego repozytorium, dodamy kolejnego pilota o nazwie „upstream”:

$ cd github-services
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream

# then: (like "git pull" which is fetch + merge)
$ git merge upstream/master master

# or, better, replay your local work on top of the fetched branch
# like a "git pull --rebase"
$ git rebase upstream/master

Masz również rubinowy klejnot, który może ułatwić operacje GitHub .

rozwidlony

Zobacz także „ Git fork is git clone? ”.


14
Zobacz także bassistance.de/2010/06/25/git-fu-updating-your-github-fork, aby uzyskać miłe podsumowanie.
— VonC

2
@syedrakib Wolę git rebase upstream/master, ale dodałem dwie możliwości w odpowiedzi.
— VonC

1
@PaBLoX jeśli rozwidlone repo, pracujesz na swoim repo, w swojej branży: rebase i zmusić push: nie zaangażowanych bałagan. Nawet trwające żądanie ściągnięcia zostanie poprawnie zaktualizowane.
— VonC

2
@PaBLoX nie tworzysz bałaganu: ty git push --force, zastępując historię swojego oddziału w GitHub przez lokalny oddział, który właśnie zmieniłeś. Ponieważ tylko ty używasz smutnej gałęzi, nie ma w tym bałaganu.
— VonC

2
Rozumiem. Nadal uważam, że to trudne, nietrywialne i nie intuicyjne. Nadal dziwne jest to, że moje zmiany będą zawsze na górze (ostatnie), podczas gdy w rzeczywistości zostały wprowadzone wcześniej. Rozwiązanie, które opublikowałem wcześniej, wygląda lepiej (nadal nie jest łatwe). Problem polega na tym, że zmiany skrótów zatwierdzania (oczywiście, ponieważ jest nowy rodzic) i generują dużo hałasu wewnątrz github, gdy wywoływane są problemy. Nadal dziwi mnie, że nie ma sposobu, aby być na bieżąco z upstreamem i zarządzać własnym widelcem bez tworzenia bezsensownych zatwierdzeń scalania lub „kłamania” na temat historii.
— Pablo Olmos de Aguilera C.

99

Oprócz odpowiedzi VonC możesz jeszcze bardziej dostosować ją do swoich upodobań.

Po pobraniu ze zdalnej gałęzi nadal będziesz musiał scalić zatwierdzenia. Chciałbym wymienić

$ git fetch upstream

z

$ git pull upstream master

ponieważ git pull jest zasadniczo git fetch + git merge.


Co jeśli wiem, że gałąź nadrzędna nie ma żadnych zmian w istniejących plikach, ale dodano tylko kilka plików zasobów - czy nadal potrzebuję scalenia?
— azec-pdx

4
Na pewno zrobi to w tym przypadku szybkie przewijanie do przodu
— Domness

w jaki sposób jeden nadrzędny nadrzędny nadpisuje wszystkie pliki lokalne (aby nie występowały konflikty scalania) w tym przypadku
— wiodący podrzędny

1
@ snh_nl git rebase upstream masterPamiętaj, że nie jest to wolne od konfliktów, jeśli wystarczająco się od niego oddzieliłeś upstream/master. Zobacz git-scm.com/docs/git-rebase (tl; dr: ten twardy resetuje twojego lokalnego mistrza do głównego, a następnie próbuje przerobić wszystkie lokalne commity od punktu rozbieżności do przodu)
— cowbert

68

Ten film pokazuje, jak zaktualizować widelec bezpośrednio z GitHub

Kroki:

  1. Otwórz widelec na GitHub.
  2. Kliknij na Pull Requests.
  3. Kliknij na New Pull Request. Domyślnie GitHub porówna oryginał z twoim widelcem i nie powinno być nic do porównania, jeśli nie wprowadzisz żadnych zmian.
  4. Kliknij na switching the base. Teraz GitHub porówna twój widelec z oryginałem i powinieneś zobaczyć wszystkie najnowsze zmiany.
  5. Kliknij, Create a pull requestaby zobaczyć to porównanie i przypisz przewidywalną nazwę do żądania ściągnięcia (np. Aktualizuj z oryginału).
  6. Kliknij na Create pull request.
  7. Przewiń w dół, kliknij Merge pull requesti na koniec Confirmscal. Jeśli twój widelec nie miał żadnych zmian, będziesz mógł scalić go automatycznie.

3
Niestety, ta przyjemna metoda graficzna powoduje dodatkowy szum w widelcu, jak wspomniano powyżej w komentarzach do zaakceptowanej odpowiedzi. Dlatego zalecana jest metoda wiersza poleceń: help.github.com/articles/syncing-a-fork
— Jonathan Cross

I nie mógł znaleźć switching the baseopcji
— Alper

64

Posługiwać się:

git remote add upstream ORIGINAL_REPOSITORY_URL

Spowoduje to ustawienie twojego upstream do repozytorium, z którego rozwidliłeś się. Następnie zrób to:

git fetch upstream      

Spowoduje to pobranie wszystkich gałęzi, w tym głównego, z oryginalnego repozytorium.

Scal te dane w lokalnym oddziale głównym:

git merge upstream/master

Wepchnij zmiany do rozwidlonego repozytorium, tj. Do źródła:

git push origin master

Voila! Po zakończeniu synchronizacji oryginalnego repozytorium.


jak sprawić, by główny nadrzędny nadpisał wszystkie pliki lokalne (więc nie ma konfliktów scalania) w tym przypadku wiodący główny nadrzędny jest w kodzie, więc ufamy temu w 100% ... udało się to zrobić
— snh_nl

Jednym ze sposobów jest po prostu usunięcie lokalnej kopii i ponowne klonowanie :)
— ARK

1

Jeśli używasz aplikacji komputerowej GitHub, w prawym górnym rogu znajduje się przycisk synchronizacji. Kliknij go, a następnie Update from <original repo>w lewym górnym rogu.

Jeśli nie ma żadnych zmian do synchronizacji, będzie to nieaktywne.

Oto kilka zrzutów ekranu, aby to ułatwić.


1

Jeśli nie ma nic do stracenia, możesz również usunąć widelec, po prostu przejdź do ustawień ... przejdź do sekcji niebezpiecznej poniżej i kliknij usuń repozytorium. Zostaniesz poproszony o podanie nazwy repozytorium i hasła po. Następnie po prostu ponownie rozwidlasz oryginał.


1

Jeśli chcesz to zrobić bez cli, możesz to zrobić w pełni na stronie Github.

  1. Przejdź do repozytorium wideł.
  2. Kliknij na New pull request.
  3. Upewnij się, że ustawiłeś widelec jako bazowe repozytorium, a oryginalne (w górę) repozytorium jako repozytorium główne. Zwykle chcesz tylko zsynchronizować gałąź master.
  4. Create new pull request.
  5. Wybierz strzałkę po prawej stronie przycisku scalania i upewnij się, że wybrano opcję podziału zamiast scalania. Następnie kliknij przycisk. W ten sposób nie spowoduje niepotrzebnego zatwierdzenia scalania.
  6. Gotowy.

0

Aby automatycznie zsynchronizować rozwidlone repozytorium z repozytorium nadrzędnym, możesz użyć aplikacji Pull na GitHub.

Więcej informacji znajduje się w pliku Readme .

Aby uzyskać zaawansowane ustawienia, w których chcesz zachować zmiany wprowadzone w rozwidlonym repozytorium, zapoznaj się z moją odpowiedzią na podobne pytanie tutaj .

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.