Estrai nuovi aggiornamenti dal repository GitHub originale nel repository GitHub biforcuto


615

Ho modificato il repository di qualcuno su GitHub e vorrei aggiornare la mia versione con commit e aggiornamenti effettuati nel repository originale. Questi sono stati realizzati dopo che ho biforcuto la mia copia.

Come posso inserire le modifiche apportate nell'origine e incorporarle nel mio repository?


1
Possibile duplicato, o forse solo correlato: unione tra forcelle in GitHub .

Nel caso in cui ci siano tag aggiuntivi che potresti voler sincronizzare, fallo git push --force origin --tagsdopo le soluzioni proposte!
MediaVince

Risposte:


716

Devi aggiungere il repository originale (quello che hai biforcato) come telecomando.

Dalla pagina man della fork di GitHub :

forchetta

Una volta completato il clone, il tuo repository avrà un telecomando chiamato "origin " che punta al fork su GitHub.
Non lasciare che il nome ti confonda, questo non punta al repository originale da cui hai effettuato la fork. Per aiutarti a tenere traccia di quel repository, aggiungeremo un altro telecomando chiamato "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

Hai anche un gemma rubino che può facilitare quelle operazioni di GitHub .

biforcuta

Vedi anche " Git fork is git clone? ".



2
@syedrakib Preferisco a git rebase upstream/master, ma ho aggiunto le due possibilità nella risposta.
VonC

1
@PaBLoX se hai effettuato un fork di un repository, stai lavorando al tuo repository, nel tuo ramo: rebase e forza una spinta: nessun pasticcio. Anche una richiesta pull in corso verrebbe correttamente aggiornata.
VonC,

2
@PaBLoX non crei confusione: tu git push --force, sostituendo la cronologia della tua filiale su GitHub con la tua filiale locale, hai appena riformulato. Poiché solo tu stai usando il ramo triste, non è coinvolto nessun casino.
VonC,

2
Capisco. Penso ancora che sia difficile, non banale e non intuitivo. Tuttavia è strano che le mie modifiche saranno sempre in primo piano (ultimo), mentre in realtà sono state apportate prima. La soluzione che ho pubblicato prima sembra migliore (ancora non banale). Il problema è che il commit degli hash cambia (ovviamente, dato che c'è un nuovo genitore) e genera molto rumore all'interno di github quando vengono chiamati problemi. Mi sorprende ancora che non ci sia modo di rimanere aggiornati con upstream e gestire il proprio fork senza creare inutili commit di unione o "mentire" sulla storia.
Pablo Olmos de Aguilera C.,

99

Oltre alla risposta di VonC, potresti modificarla ulteriormente a tuo piacimento.

Dopo aver recuperato dal ramo remoto, dovresti comunque unire i commit. Vorrei sostituire

$ git fetch upstream

con

$ git pull upstream master

poiché git pull è essenzialmente git fetch + git merge.


Cosa succede se so che il ramo upstream non ha alcuna modifica ai file esistenti, ma solo pochi file di risorse aggiunti - devo ancora unire?
azec-pdx,

4
Sicuramente farà solo un avanzamento veloce in quel caso
Domness

come fa un master upstream a sovrascrivere tutti i file locali (quindi nessun conflitto di unione) il master upstream è in testa al codice in questo caso, quindi crediamo che sia al 100% ... siamo riusciti a farlo
snh_nl,

1
@snh_nl git rebase upstream masterNota che questo non è privo di conflitti se ti sei sufficientemente allontanato upstream/master. Vedi git-scm.com/docs/git-rebase (tl; dr: questo hard reimposta il tuo master locale a quello dell'upstream, quindi cerca di rimettere insieme tutti gli commit locali dal punto di divergenza in avanti)
cowbert

68

Questo video mostra come aggiornare un fork direttamente da GitHub

passi:

  1. Apri la forcella su GitHub.
  2. Clicca su Pull Requests .
  3. Clicca su New Pull Request. Per impostazione predefinita, GitHub confronta l'originale con il tuo fork e non ci dovrebbe essere nulla da confrontare se non hai apportato modifiche.
  4. Clicca su switching the base. Ora GitHub confronterà il tuo fork con l'originale e dovresti vedere tutte le ultime modifiche.
  5. Fai clic su Create a pull requestper questo confronto e assegna un nome prevedibile alla tua richiesta pull (ad esempio, Aggiorna dall'originale).
  6. Clicca suCreate pull request .
  7. Scorri verso il basso e fai clic Merge pull requeste infine Confirmunisci. Se il tuo fork non ha subito modifiche, sarai in grado di unirlo automaticamente.

3
Sfortunatamente, questo bel metodo grafico crea ulteriore rumore nel fork come menzionato sopra nei commenti per la risposta accettata. Pertanto si consiglia il metodo da riga di comando: help.github.com/articles/syncing-a-fork
Jonathan Cross

Non riuscivo a trovare l' switching the baseopzione
Alper

64

Uso:

git remote add upstream ORIGINAL_REPOSITORY_URL

Questo imposterà il tuo upstream sul repository da cui hai effettuato la fork. Quindi fai questo:

git fetch upstream      

Ciò recupererà tutti i rami incluso master dal repository originale.

Unisci questi dati nella tua filiale principale locale:

git merge upstream/master

Invia le modifiche al repository biforcato, ad esempio all'origine:

git push origin master

Ecco! Hai terminato la sincronizzazione del repository originale.


come fa un master upstream a sovrascrivere tutti i file locali (quindi nessun conflitto di unione) il master upstream è in testa al codice in questo caso, quindi crediamo che sia al 100% ... siamo riusciti a farlo
snh_nl,

Un modo è semplicemente eliminare la copia locale ed eseguire una nuova clonazione :)
ARK

1

Se stai utilizzando l'applicazione desktop GitHub, c'è un pulsante di sincronizzazione nell'angolo in alto a destra. Cliccaci sopra alloraUpdate from <original repo> alto a sinistra.

Se non ci sono cambiamenti da sincronizzare, questo sarà inattivo.

Ecco alcuni screenshot per renderlo facile.


1

Se non c'è nulla da perdere, puoi anche eliminare il fork, vai alle impostazioni ... vai alla sezione delle zone di pericolo di seguito e fai clic su Elimina repository. Ti verrà chiesto di inserire il nome del repository e la password dopo. Dopodiché bifogli di nuovo l'originale.


1

Se vuoi farlo senza cli, puoi farlo completamente sul sito web di Github.

  1. Vai al repository fork.
  2. Clicca su New pull request .
  3. Assicurati di impostare il tuo fork come repository base e il repository originale (upstream) come repository head. Di solito si desidera solo sincronizzare il ramo principale.
  4. Create new pull request.
  5. Seleziona la freccia a destra del pulsante di fusione e assicurati di scegliere rifasare invece di unire. Quindi fare clic sul pulsante. In questo modo, non produrrà un commit merge non necessario.
  6. Fatto.

0

Per sincronizzare automaticamente il repository biforcato con il repository principale, è possibile utilizzare l' app Pull su GitHub.

Fare riferimento al file Leggimi per maggiori dettagli.

Per una configurazione avanzata in cui desideri conservare le modifiche apportate al repository biforcato, fai riferimento alla mia risposta su una domanda simile qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.