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.