Pytanie Jak zaktualizować rozwidlone repozytorium GitHub?


Niedawno rozwidniłem projekt i zastosowałem kilka poprawek. Następnie utworzyłem żądanie ściągnięcia, które zostało następnie zaakceptowane.

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

Jak mogę wprowadzić tę zmianę do mojego widelca? Czy muszę usunąć i ponownie utworzyć widelec, gdy będę miał dalsze zmiany, aby przyczynić się do jego rozwoju? Czy jest tam przycisk aktualizacji?


2834
2017-08-30 13:53


pochodzenie


Można to również zrobić z interfejsu użytkownika github. Chciałbym przyznać [temu plakatowi] [1]. [1]: stackoverflow.com/a/21131381/728141 - Mike Schroll
Kolejny dobry blog na ten temat - Utrzymywanie widelca GitHub Zaktualizowano - Arup Rakshit
Znalazłem to w artykułach pomocy Githuba: help.github.com/articles/syncing-a-fork - Pranav
Czy to jest duplikat stackoverflow.com/questions/3903817/... ? - David Cary
Oto demo wideo, które robi to za pomocą dwóch kont github youtube.com/watch?v=kpE0gTX4ycE - lifebalance


Odpowiedzi:


W lokalnym klonie twojego rozwidlonego repozytorium możesz dodać oryginalne repozytorium GitHub jako "zdalnego". ("Remotes" są jak pseudonimy dla adresów URL repozytoriów - origin to na przykład jeden.) Następnie możesz pobrać wszystkie gałęzie z tego repozytorium wyższego poziomu i zmienić swoją pracę, aby kontynuować pracę nad wersją źródłową. Pod względem komend, 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 głównej (na przykład, ponieważ inne osoby mogły ją sklonować), powinieneś zamienić ostatnie polecenie na git merge upstream/master. Jednakże, aby móc wykonywać dalsze żądania ściągania, które są tak czyste, jak to tylko możliwe, prawdopodobnie lepiej jest dokonać ponownego wyboru.


Jeśli przełączyłeś swoją gałąź na upstream/master możesz potrzebować wymusić push, aby wypchnąć go do własnego rozwidlonego repozytorium na GitHub. Można to zrobić za pomocą:

git push -f origin master

Musisz tylko użyć -f pierwszy raz po ponownym utworzeniu.


3103
2017-08-30 14:01



Ponieważ widelec istnieje tylko na github, a github nie ma narzędzi do robienia połączeń za pośrednictwem interfejsu sieciowego, wtedy właściwą odpowiedzią jest lokalne scalenie i przeniesienie zmian z powrotem na widelec. - Tim Keating
Oto świetny samouczek, który znalazłem podczas pracy z github: gun.io/blog/how-to-github-fork-branch-and-pull-request - Tim Keating
Krótka notka, że ​​zamiast odnawiać swój własny oddział główny, aby upewnić się, że zaczynasz od czystego stanu, powinieneś prawdopodobnie pracować na oddzielnej gałęzi i wykonać żądanie wyciągnięcia z tego. Dzięki temu mistrz będzie czysty dla przyszłych fuzji i nie będzie musiał przepisywać historii -f który zabija wszystkich, którzy mogli sklonować twoją wersję. - Mateusz Kowalczyk
Zamiast polecenia rebase użyłem: git merge --no-ff upstream/master W ten sposób twoje zatwierdzenia nie są już na wierzchu. - Steckdoserich
Kolejna porażka Gita. Jeśli te narzędzia mają wspierać rozproszoną współpracę, to dlaczego tak trudno jest wykonać podstawowy przepływ pracy? 4 miliony ludzi i 2200 przegranych oznacza, że ​​narzędzie się nie udało. "możesz dodać oryginalne repozytorium GitHub jako" zdalne " - Dlaczego trzeba to zrobić? Dlaczego nie robi się tego podczas rozwidlenia? Co jest tak zepsute w tym narzędziu? - jww


Od maja 2014 r. Istnieje możliwość aktualizacji widelca bezpośrednio z GitHub. To nadal działa od września 2017 r., ALE to doprowadzi do brudnej historii commitów.

  1. Otwórz widelec na GitHub.
  2. Kliknij Wyciągnij wnioski.
  3. Kliknij Nowe żądanie wycofania. Domyślnie GitHub porównuje oryginał z widelcem i nie powinno być nic do porównania, jeśli nie wprowadzono żadnych zmian.
  4. Kliknij przełączanie bazy jeśli widzisz ten link. W przeciwnym razie ustaw ręcznie opcję widelec podstawowy opuść się do twojego widelca, a widelec do głowy do góry. Teraz GitHub porówna twój widelec z oryginałem i powinieneś zobaczyć wszystkie najnowsze zmiany. enter image description here
  5. Utwórz żądanie wyciągnięcia i przypisz przewidywalną nazwę do żądania wyciągnięcia (np. Update from original).
  6. Przewiń w dół do Połącz żądanie ściągania, ale jeszcze nic nie klikaj.

Teraz masz trzy opcje, ale każda z nich doprowadzi do mniejszej niż czystej historii zatwierdzania.

  1. Wartość domyślna utworzy brzydkie zatwierdzenie scalania.
  2. Jeśli klikniesz menu i wybierzesz "Squash and merge", wszystkie interweniujące commity zostaną przycięte do jednego. Jest to najczęściej coś, czego nie chcesz.
  3. Jeśli klikniesz Rozwiń i scal, wszystkie zatwierdzenia będą "z" tobą, oryginalne PR będą linkować do twojego PR, a GitHub wyświetli This branch is X commits ahead, Y commits behind <original fork>.

Więc tak, możesz aktualizować swoje repo z jego upstream za pomocą interfejsu internetowego GitHub, ale spowoduje to sully historię commit. Trzymaj się wiersz poleceń zamiast tego - to łatwe.


642
2018-05-25 07:31



To działało świetnie jeden raz. Po raz drugi proces ten nie działał w ten sam sposób: link "Zmiana bazy" nie pojawił się. A kiedy kliknęło "Kliknij, aby utworzyć żądanie ściągnięcia", utworzyło PR w repozytorium SOURCE. NIE to, czego chciałem ... - javadba
Nadal działa (marzec 2015), ale link "Switching the base" już tam nie ma. Musisz zmienić listę rozwijaną "Podstawowa", tak aby oba wskazywały na widelec, a następnie pojawi się monit "Porównanie przekupów", który zabierze Cię tam, gdzie chcesz. - mluisbrown
Kwiecień 2015. Prace. Dzięki. Zrobiłem "Przełącz na bazę". Jednak krok 6 to "Utwórz żądanie wyciągnięcia" -> wprowadź komentarz -> "Utwórz żądanie wyciągnięcia". Koniec z 1 zatwierdzeniem przed oryginałem. - cartland
@cartland (lub inne) - tak, mówi: "Ta gałąź ma 1 commit before ..." Czy to coś, o co trzeba się martwić? Czy można pozbyć się tej wiadomości? - RenniePet
nie byłoby lepiej, z prostym przyciskiem aktualizacji lub synchronizacji! - transformer


Oto oficjalny dokument GitHub na temat Synchronizowanie widelca:

Synchronizowanie widelca

Ustawić

Zanim będzie można zsynchronizować, należy dodać pilota wskazującego repozytorium. Być może zrobiłeś to, gdy początkowo się rozwidlałeś.

Wskazówka: Synchronizowanie widelca powoduje jedynie aktualizację lokalnej kopii repozytorium; nie aktualizuje twojego 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)

Synchronizuję

Aby zsynchronizować swoje repozytorium z kluczem źródłowym, musisz wykonać dwa kroki: najpierw musisz pobrać ze zdalnego, a następnie połączyć żądaną gałąź z lokalnym oddziałem.

Ujmujący

Pobieranie ze zdalnego repozytorium spowoduje przeniesienie jego oddziałów i ich odpowiednich zatwierdzeń. Są one przechowywane w lokalnym repozytorium w specjalnych oddziałach.

$ 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

Teraz mamy 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, chcemy scalić jego zmiany w naszym lokalnym oddziale. Spowoduje to zsynchronizowanie tej gałęzi z wcześniejszą wersją, 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 Twój lokalny oddział nie ma żadnych unikalnych zobowiązań, git zamiast tego wykona "fast-forward":

$ 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 GitHub, postępuj zgodnie z instrukcjami tutaj


365
2017-10-21 23:04



To aktualizuje mój lokalny fork, ale mój fork na Github.com nadal mówi "43 popełnia za". Musiałem zastosować technikę lobzik, aby utworzyć żądanie ciągnięcia dla siebie, aby połączyć główne zmiany z moim widelcem Github.com. - Michael McGinnis
@MichaelMcGinnis Po scaleniu lokalnie, musisz wprowadzić zmiany do github. git push origin master - jumpnett
Może być sprytny, żeby się popchnąć --follow-tags: stackoverflow.com/a/26438076/667847 - kenny
Muszę to zrobić osobno dla wszystkich oddziałów git merge upstream/master, a następnie sprawdź, aby rozwinąć oddział i zrobić git merge upstream/develop - Shobi P P
stackoverflow.com/a/14074925/470749 był dla mnie pomocny, ponieważ dostawałem Permission denied (publickey). fatal: Could not read from remote repository. przy próbie pobrania z konta Github na Facebooku. - Ryan


Wiele odpowiedzi kończy się przenoszeniem widelca jeden commit z wyprzedzeniem repozytorium nadrzędnego. Ta odpowiedź podsumowuje znalezione kroki tutaj które będą przenieś widelec do tego samego zatwierdzenia, co rodzic.

  1. Zmień katalog na lokalne repozytorium.

    • Przejdź do głównej gałęzi, jeśli nie jesteś git checkout master
  2. Dodaj rodzica jako zdalne repozytorium, git remote add upstream <repo-location>

  3. Kwestia git fetch upstream
  4. Kwestia git rebase upstream/master

    • Na tym etapie sprawdzasz, czy zatwierdza to, co zostanie scalone przez wpisanie git status
  5. Kwestia git push origin master

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


81
2017-08-05 14:59



@MT: Gdzie jednak wpisać te polecenia? Istota pytania, jak rozumiem, polega na ponownym zsynchronizowaniu twojego osobistego GitHub widelec z głównym projektem, oraz zrób to wszystko z GitHub. Innymi słowy, w jaki sposób można zaktualizować zdalny widelec bez lokalne repozytorium? - John Y
@JohnY Korzystanie z GitHub zawsze tworzy dodatkowe zatwierdzenie. Musisz zrobić to wszystko w powłoce na lokalnym repo, aby uniknąć dodatkowego zatwierdzenia. - Jonathan Cross


Od listopada 2013 r. Otwarto nieoficjalną prośbę o dodanie funkcji z GitHub, aby poprosić ich o dodanie bardzo prostej i intuicyjnej metody zachowania synchronizacji lokalnego widelca z wcześniejszym:

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

Uwaga: Ponieważ prośba o funkcję jest nieoficjalna, wskazane jest również skontaktowanie się support@github.com aby dodać obsługę takiej funkcji do wdrożenia. Powyższe nieoficjalne żądanie dotyczące funkcji może zostać wykorzystane jako dowód na zainteresowanie w tym zakresie.


39
2018-02-21 10:42





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

Załóżmy, że sklonowałeś już swój widelec do komputera za pomocą następującego polecenia:

git clone git@github.com:your_name/project_name.git
cd project_name

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

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

    git remote add upstream git@github.com:original_author/project_name.git
    
  2. Pobierz zatwierdzenia (i gałęzie) z "upstream":

    git fetch upstream
    
  3. Przejdź do gałęzi "master" twojego widelca ("origin"):

    git checkout master
    
  4. Zastąp zmiany w gałęzi "master":

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

    git merge upstream/master
    
  6. Rozwiąż konflikty scalania, jeśli takie istnieją, i dokonaj scalenia

    git commit -am "Merged from upstream"
    
  7. Wciśnij zmiany na widelec

    git push
    
  8. Odzyskaj swoje ukryte zmiany (jeśli są)

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

GitHub dostarcza również instrukcje dla tego tematu: Synchronizowanie widelca


29
2018-03-16 12:24



Pomagał częściowo: Jest git remote add upstream git@github.com:original_author/project_name.git po prostu alias dla git remote add upstream https://github.com/original_author/project_name.git ? - Wolf
Wilk, domyślam się, że wiesz to już teraz, ale dla potomności ... To jest format ssh. help.github.com/articles/configuring-a-remote-for-a-fork - Brad Ellis


Jeśli, tak jak ja, ty nigdy nie powierzaj niczego bezpośrednio mistrzowi, które naprawdę powinieneś zrobić, możesz wykonać następujące czynności.

Z lokalnego klonu widelca stwórz swój pilot. Trzeba to zrobić tylko raz:

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

Następnie za każdym razem, gdy chcesz dogonić główną gałąź 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ąć swojego lokalnego mistrza do swojego odległego widelca GitHub. Możesz także ponownie utworzyć gałąź rozwojową swojego aktualnego lokalnego mistrza.

Tak więc przed początkową konfiguracją i główną kontrolą, wystarczy, że uruchomisz następujące polecenie, aby zsynchronizować swój wzorzec z dostawcą: Git pull upstream master.


22
2018-01-03 16:59





Na dzień tej odpowiedzi GitHub nie ma (czy już nie powiem?) ta funkcja w interfejsie internetowym. Możesz jednak zapytać support@github.com aby dodać swój głos na to.

W międzyczasie użytkownik GitHub bardiharborow stworzył narzędzie, które ma właśnie to zrobić: https://upriver.github.io/

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


21
2017-09-14 14:22



Chociaż uważam, że narzędzie jest dobrym pomysłem, rzeczywistość jest BROKEN. Załadował tylko 20 kopii z mojego konta, a nawet stopka przekierowuje do strony internetowej, która nie istnieje. Jeśli to naprawię, będę wielkim adwokatem. - sorin
Na dzień dzisiejszy z powodzeniem wykorzystałem upriver do zsynchronizowania widelca z repozytorium, więc działa on dla moich celów i będę go nadal używać. - NauticalMile
@sorin Te 20 ograniczeń repo / branch (a raczej 30) pochodzi z domyślnych ustawień stronicowania GitHub. Aby móc sobie z tym poradzić, muszą istnieć pewne adaptacje do kodu. - Andreas


Jeśli korzystasz z GitHub dla Windows, teraz mają one funkcję jednego kliknięcia, aby zaktualizować widły:

  1. Wybierz repozytorium w interfejsie użytkownika.
  2. Kliknij przycisk "Uaktualnij z użytkownika / gałęzi" u góry.

12
2018-03-31 21:45



Działa to również w Github for Mac. - Steve Moser


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

Zamówienie do oddziału

Składnia: git branch yourDevelopmentBranch
Przykład: git checkout master

Przeciągnij gałąź repozytorium źródeł, aby uzyskać najnowszy kod

Składnia: git pull https://github.com/tastejs/awesome-app-ideas mistrz
Przykład: git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git NAZWA ODDZIAŁU


8
2018-01-15 12:31



Jeśli używasz GitHub, możesz również przesłać swoje zmiany do oddziału GitHub. git push HttpsForYourForkOfTheRepo BRANCH_NAME - user3731622
To jest świetne. Najprostsze i najczystsze rozwiązanie. - JakeGould


W rzeczywistości możliwe jest utworzenie gałęzi w twoim widelcu z dowolnego zatwierdzenia upstream w przeglądarce:

  • otwarty https://github.com/<repo>/commits/<hash>, gdzie repo to twój widelec, i haszysz jest pełnym hashem zatwierdzenia, które można znaleźć w interfejsie internetowym upstream. Na przykład mogę otworzyć https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990, który wskazuje linux  master w czasie pisania.
  • Kliknij przycisk "Drzewo: ....".
  • Wpisz nazwę nowego oddziału i naciśnij Wchodzić

Enter image description here

Następnie możesz pobrać tę gałąź do lokalnego klona i nie będziesz musiał przesyłać wszystkich tych danych z powrotem do GitHub, gdy będziesz wprowadzać zmiany na górze tego zatwierdzenia. Lub użyj interfejsu internetowego, aby zmienić coś w tej gałęzi.

Jak to działa (to jest domysły, nie wiem jak dokładnie robi to GitHub): widły udostępniają miejsce przechowywania i użycia przestrzenie nazw rozdzielić odniesienia użytkowników. Możesz więc uzyskać dostęp do wszystkich zatwierdzeń za pomocą widelca, nawet jeśli nie istniały do ​​czasu rozwidlenia.


8
2018-01-18 06:41



To jest świetne! Pozwala to uniknąć całkowicie bezcelowego przesyłania tych zatwierdzeń do github. - Rotsor