Jak zaktualizować repozytorium GitHub forked?

Niedawno rozwidlałem projekt i zastosowałem kilka poprawek. Następnie utworzyłem pull request, który został następnie zaakceptowany.

Kilka dni później kolejna zmiana została dokonana przez innego współpracownika. Więc mój widelec nie zawiera tej reszty.

Jak mogę włożyć tę zmianę do widelca? Czy muszę usuwać i ponownie tworzyć mój fork, gdy muszę wprowadzić kolejne zmiany? A może jest przycisk aktualizacji?

 2906
Author: nbro, 2011-08-30

16 answers

W lokalnym klonie rozwidlonego repozytorium, możesz dodać oryginalne repozytorium GitHub jako "zdalne". ("Piloty" są jak pseudonimy dla adresów URL repozytoriów - origin jest jednym, na przykład.) Następnie możesz pobrać wszystkie gałęzie z tego repozytorium i przełączyć swoją pracę, aby kontynuować pracę nad wersją upstream. Pod względem poleceń, które mogą wyglądać następująco:

# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

Jeśli nie chcesz przepisywać historii swojej gałęzi master, (na przykład dlatego, że inni ludzie może je sklonować) następnie należy zastąpić ostatnią komendę git merge upstream/master. Jednak do tworzenia dalszych żądań ciągnięcia, które są tak czyste, jak to możliwe, prawdopodobnie lepiej jest rebase.


Jeśli zmieniłeś swoją gałąź na upstream/master, Być może będziesz musiał wymusić push, aby przenieść ją do własnego rozwidlonego repozytorium na Githubie. Zrobiłbyś to z:

git push -f origin master

Wystarczy użyć -f za pierwszym razem po rebasowaniu.

 3179
Author: Mark Longair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-09 11:19:46

Począwszy od maja 2014, możliwe jest zaktualizowanie forka bezpośrednio z GitHub. To nadal działa od września 2017, ale doprowadzi to do brudnej historii zmian.

    Otwórz Widelec na Githubie.
  1. Kliknij na Pull Requests.
  2. Kliknij na New Pull Request. Domyślnie GitHub porównuje oryginał z Twoim forkiem i nie powinno być nic do porównania, jeśli nie wprowadziłeś żadnych zmian.
  3. Click switching the base jeśli widzisz ten link. W przeciwnym razie ręcznie ustaw widelec bazowy w dół do widelca, a widelec główny w górę. Teraz GitHub porówna Twój fork z oryginałem i powinieneś zobaczyć wszystkie najnowsze zmiany. Tutaj wpisz opis obrazka
  4. Utwórz pull request i nadaj przewidywalną nazwę żądaniu pull (np. Update from original).
  5. przewiń w dół do Merge pull request , ale nie klikaj jeszcze niczego.

Teraz masz trzy opcje, ale każda z nich prowadzi do historii zatwierdzeń mniej niż czysta.

  1. domyślnie utworzy brzydki commit scalający.
  2. Jeśli klikniesz na listę rozwijaną i wybierzesz "Squash and merge", wszystkie zmiany zostaną zmiażdżone w jeden. To jest najczęściej coś, czego nie chcesz.
  3. Jeśli klikniesz Rebase i połączysz, wszystkie commity zostaną wykonane" z " Tobą, oryginalny PRs połączy się z Twoim PR, a GitHub wyświetli This branch is X commits ahead, Y commits behind <original fork>.

Więc tak, możesz zatrzymać repo zaktualizowano go przy użyciu interfejsu WWW GitHub, ale spowoduje to splamienie historii zmian. Zamiast tego trzymaj się linii poleceń - to proste.

 650
Author: lobzik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 20:41:33

Oto oficjalny dokument Githuba na temat synchronizacji widelca :

Synchronizacja widelca

The Setup

Zanim będzie można zsynchronizować, musisz dodać pilota, który wskazuje na repozytorium upstream. Mogłeś to zrobić, kiedy pierwotnie rozwidlałeś.

Wskazówka: Synchronizacja forka aktualizuje tylko lokalną kopię repozytorium; nie aktualizuje repozytorium na GitHub.

$ git remote -v
# List the current remotes
origin  https://github.com/user/repo.git (fetch)
origin  https://github.com/user/repo.git (push)

$ git remote add upstream https://github.com/otheruser/repo.git
# Set a new remote

$ git remote -v
# Verify new remote
origin    https://github.com/user/repo.git (fetch)
origin    https://github.com/user/repo.git (push)
upstream  https://github.com/otheruser/repo.git (fetch)
upstream  https://github.com/otheruser/repo.git (push)

Synchronizacja

Istnieją dwa kroki wymagane do synchronizacji repozytorium z upstream: najpierw musisz pobrać ze zdalnego, a następnie scalić żądaną gałąź do lokalnej gałęzi.

Pobieranie

Pobieranie ze zdalnego repozytorium spowoduje dodanie gałęzi i odpowiednich commitów. Są one przechowywane w lokalnym repozytorium w oddziałach specjalnych.

$ git fetch upstream
# Grab the upstream remote's branches
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/otheruser/repo
 * [new branch]      master     -> upstream/master

Mamy teraz główną gałąź upstream przechowywaną w lokalnej gałęzi, upstream / master

$ git branch -va
# List all local and remote-tracking branches
* master                  a422352 My local commit
  remotes/origin/HEAD     -> origin/master
  remotes/origin/master   a422352 My local commit
  remotes/upstream/master 5fdff0f Some upstream commit

Scalanie

Teraz, gdy pobraliśmy repozytorium upstream, chcemy scalić jego zmiany do naszej lokalnej gałęzi. Spowoduje to zsynchronizowanie tej gałęzi z upstream, bez utraty naszych lokalnych zmian.

$ git checkout master
# Check out our local master branch
Switched to branch 'master'

$ git merge upstream/master
# Merge upstream's master into our own
Updating a422352..5fdff0f
Fast-forward
 README                    |    9 -------
 README.md                 |    7 ++++++
 2 files changed, 7 insertions(+), 9 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md

Jeśli Twoja lokalna gałąź nie miała żadnych unikalnych commitów, git wykona "przewijanie do przodu":

$ git merge upstream/master
Updating 34e91da..16c56ad
Fast-forward
 README.md                 |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Wskazówka: Jeśli chcesz zaktualizować swoje repozytorium na Githubie, postępuj zgodnie z instrukcjami tutaj

 377
Author: jumpnett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-21 19:38:46

Wiele odpowiedzi kończy się przesunięciem twojego forka o jeden commit przed macierzystego repozytorium. Ta odpowiedź podsumowuje kroki znalezione tutaj , które przeniosą Twój Fork do tego samego commita co rodzic .

  1. Zmień katalog do lokalnego repozytorium.

    • przełącz się na gałąź master jeśli nie jesteś git checkout master
  2. Dodaj rodzica jako zdalne repozytorium, git remote add upstream <repo-location>

  3. Wydanie git fetch upstream
  4. Problem git rebase upstream/master

    • na tym etapie sprawdzasz czy commity zostaną scalone wpisując git status
  5. Wydanie git push origin master

Aby uzyskać więcej informacji na temat tych poleceń, zobacz Krok 3 .

 83
Author: Sahar Rabinoviz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-19 04:49:14

Od listopada 2013 roku istnieje nieoficjalne żądanie funkcji otwarte przez GitHub, aby poprosić ich o dodanie bardzo prostej i intuicyjnej metody synchronizacji lokalnego forka z upstream:

Https://github.com/isaacs/github/issues/121

Uwaga: Ponieważ żądanie funkcji jest nieoficjalne, zaleca się również skontaktować się z [email protected], aby dodać wsparcie dla funkcji takiej jak ta, która ma zostać zaimplementowana. Powyższe nieoficjalne żądanie funkcji może być wykorzystane jako dowód wysokości odsetek w tym jest realizowane.

 39
Author: isedwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-19 04:50:46

Przedmowa: Twój fork to "origin", a repozytorium, z którego się rozwidlałeś, to "upstream".

Załóżmy, że sklonowałeś już swój fork do swojego komputera za pomocą polecenia takiego jak:

git clone [email protected]:your_name/project_name.git
cd project_name

Jeśli to jest podane, musisz kontynuować w tej kolejności:

  1. Dodaj "upstream" do sklonowanego repozytorium ("origin"):

    git remote add upstream [email protected]:original_author/project_name.git
    
  2. Pobiera commity (i gałęzie) z "pod prąd": {]}

    git fetch upstream
    
  3. Przełącz na gałąź "master" swojego widelca ("origin"):

    git checkout master
    
  4. Ukryj zmiany swojej gałęzi "master":

    git stash
    
  5. Scal zmiany z gałęzi "master" z "upstream" do gałęzi "master" z "origin":

    git merge upstream/master
    
  6. Rozwiązuj konflikty scalające, jeśli istnieją i zatwierdź połączenie

    git commit -am "Merged from upstream"
    
  7. Wciśnij zmiany do widelca

    git push
    
  8. Get back your stashed changes (if any)

    git stash pop
    
  9. Jesteś skończony! Gratulacje!

GitHub zawiera również instrukcje dla tego tematu: Synchronizacja widelca

 29
Author: Benny Neugebauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 13:53:15

Jeśli, tak jak ja, nigdy nie powierzasz niczego bezpośrednio mistrzowi , co naprawdę powinieneś, możesz wykonać następujące czynności.

Z lokalnego klonu twojego forka, utwórz swój zdalny upstream. Musisz to zrobić tylko raz:

git remote add upstream https://github.com/whoever/whatever.git

Wtedy, gdy chcesz nadrobić zaległości z nadrzędną gałęzią repozytorium, musisz:

git checkout master
git pull upstream master
Zakładając, że nigdy nie popełniłeś niczego na mistrzu, powinieneś już to zrobić. Teraz możesz popchnąć lokalnego mistrza do swojego pochodzenia zdalny widelec GitHub. Możesz również zmienić swoją gałąź deweloperską na aktualnym lokalnym master.

Tak więc po wstępnej konfiguracji upstream i master checkout, wystarczy uruchomić następujące polecenie, aby zsynchronizować swój master z upstream: git pull upstream master.

 25
Author: Slion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-08 07:25:04

Od Daty tej odpowiedzi, GitHub nie ( Czy mam powiedzieć, że już nie?) Ta funkcja w interfejsie WWW. Możesz jednak poprosić [email protected] o dodanie swojego głosu na to.

W międzyczasie, użytkownik GitHub bardiharborow stworzył narzędzie do tego: https://upriver.github.io/

Źródło jest tutaj: https://github.com/upriver/upriver.github.io

 21
Author: Lucero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-14 14:22:15

Jeśli używasz GitHub dla Windows, teraz mają one funkcję aktualizacji forków jednym kliknięciem:

  1. Wybierz repozytorium w interfejsie użytkownika.
  2. Kliknij przycisk "Update from user / branch" u góry.
 12
Author: ShitalShah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-25 07:06:46

Wykonaj poniższe kroki. Próbowałem ich i to mi pomogło.

Checkout to your branch

Składnia: Git branch yourDevelopmentBranch
Przykład: Git checkOut master

Pull source repository branch for getting the latest code

Składnia: git pull https://github.com/tastejs/awesome-app-ideas master
Przykład: git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME

 8
Author: Venkat.R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-19 04:49:53

W rzeczywistości można utworzyć gałąź w forku z dowolnego commita w przeglądarce:

Tutaj wpisz opis obrazka

Możesz następnie pobrać tę gałąź do swojego lokalnego klona i nie będziesz musiał wysyłać wszystkich danych z powrotem do GitHub, gdy wciśniesz zmiany na górze tego commita. Lub użyj interfejsu WWW, aby zmienić coś w tej gałęzi.

Jak to działa (domyślam się, nie wiem jak to dokładnie robi GitHub): forki współdzielą object storage i używają przestrzeni nazw do oddzielania referencji użytkowników. Więc możesz uzyskaj dostęp do wszystkich commitów za pośrednictwem forka, nawet jeśli nie istniały do czasu rozwidlenia.

 8
Author: max630,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-19 03:22:48

Aktualizuję moje rozwidlone repos z tą jedną linijką:

git pull https://github.com/forkuser/forkedrepo.git branch

Użyj tego, jeśli nie chcesz dodawać innego zdalnego punktu końcowego do swojego projektu, jak inne rozwiązania opublikowane tutaj.

 4
Author: R.Bravo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-08 02:00:37

Jako uzupełnienie tej odpowiedzi, szukałem sposobu, aby zaktualizować wszystkie zdalne gałęzie mojego sklonowanego repo ( origin) z upstream gałęziami za jednym zamachem. Tak to zrobiłem.

Zakłada to, że skonfigurowano już upstreamzdalne wskazywanie repozytorium źródłowego (gdzie origin zostało rozwidlone) i zsynchronizowano je z git fetch upstream.

Następnie uruchom:

for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done

Pierwsza część tego polecenia zawiera listę wszystkich głowic w upstream remote repo i usuwa SHA-1, po którym następuje prefiks nazwy gałęzi refs/heads/.

Następnie dla każdej z tych gałęzi pcha lokalną kopię upstream remote tracking branch (refs/remotes/upstream/<branch> Po stronie lokalnej) bezpośrednio do zdalnej gałęzi na origin (refs/heads/<branch> Po stronie zdalnej).

Każda z tych komend synchronizacji gałęzi może się nie udać z jednego z dwóch powodów: albogałąź upstream została przepisana, albo wcisnąłeś commity tej gałęzi do swojego forka. W pierwszym przypadku jeśli nie przypisałeś nic do gałęzi na swoim widelcu, możesz bezpiecznie nacisnąć ją siłą (Dodaj przełącznik -f, tzn. git push -f w Komendzie powyżej). W drugim przypadku jest to normalne, ponieważ twoja gałąź fork się rozeszła i nie możesz oczekiwać, że komenda sync będzie działać, dopóki twoje commity nie zostaną połączone z powrotem do upstream .

 4
Author: Thomas Guyot-Sionnest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-08 04:31:05

Android Studio nauczyło się teraz pracować z repozytoriami GitHub fork (nie musisz nawet dodawać zdalnego repozytorium" upstream " za pomocą polecenia konsoli).

Otwórz menu VCSGit

I zwróć uwagę na dwie ostatnie pozycje menu:

  • Rebase my GitHub fork

  • Utwórz Pull Request

Spróbuj. Używam pierwszego do synchronizacji lokalnego repozytorium. Anyway the branches from the zdalne repozytorium rodzica ("upstream") będzie dostępne w Android Studio po kliknięciu "Rebase my GitHub fork" i będziesz mógł z nimi łatwo pracować.

(używam Android Studio 3.0 z wtyczkami "Git integration" i "GitHub".)

Tutaj wpisz opis obrazka

 3
Author: alexshr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-19 03:25:32

Po sklonowaniu rozwidlonego repozytorium, przejdź do ścieżki katalogu, w którym znajduje się twój klon i kilku linii w Terminalu Git Bash.

$ cd project-name

$ git remote add upstream https://github.com/user-name/project-name.git
 # Adding the upstream -> the main repo with which you wanna sync

$ git remote -v # you will see the upstream here 

$ git checkout master # see if you are already on master branch

$ git fetch upstream
I gotowe. Wszystkie zaktualizowane zmiany w głównym repozytorium zostaną przeniesione do repozytorium fork.

Polecenie "fetch "jest niezbędne, aby być na bieżąco w projekcie: tylko podczas wykonywania" git fetch " będziesz informowany o zmianach, które twoi koledzy wypchnęli na zdalny serwer.

Ty można jeszcze odwiedzić tutaj dla dalszych zapytań

 3
Author: Prateek Chanda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-10 02:21:30

To zależy od rozmiaru repozytorium i sposobu jego rozwidlenia.

Jeśli jest to dość duże repozytorium, być może chciałeś nim zarządzać w specjalny sposób(np. historia upuszczania). Zasadniczo można uzyskać różnice między bieżącą i upstream wersje, zatwierdzić je, a następnie cherry pick z powrotem do master.

Spróbuj przeczytać Ten . Opisuje jak obsługiwać duże repozytoria Git i jak wysyłać je z najnowszymi zmianami.

 1
Author: s0nicYouth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-10 22:05:32