Come posso sincronizzare il mio fork senza aggiungere un telecomando separato?


302

Supponiamo che ci sia un repository someone/foobarsu GitHub, a cui ho effettuato il fork me/foobar.

Come posso estrarre nuovi commit dal repository principale direttamente sul mio fork , senza dover aggiungere un telecomando separato e ricordare di estrarre regolarmente da lì ?

L'obiettivo è:

  • git pull per recuperare dal repository principale
  • git push per inviare tutto al mio fork

26
La sorprendente risposta di @Olufemi sembra fare quello che vuoi, tranne che, come osserva ChristianGosch in un commento, finisci con un "commit di unione" in cima al tuo ramo e "nulla da confrontare" non apparirà. Ciò sembra inaccettabile per molti progetti per i quali si desidera creare filiali da attirare. Quindi non c'è davvero alcun modo per eseguire questo flusso di lavoro dei contributori più basilare in github senza eseguire comandi arcane git su un personal computer? O forse dovrei semplicemente buttare via tutto il mio repository e ri-fork ogni volta che voglio contribuire ??
nealmcb,




@nealmcb Il problema con un "commit di unione" nella parte superiore del ramo è evitato se si ribatte?
Marko,

Risposte:


586

Apri il repository Git biforcuto me / foobar .

Clicca su Confronta :

Ecco un'immagine di esempio della pagina

Riceverai la notifica:

Non c'è niente da confrontare.
qualcuno: il maestro è aggiornato con tutti i miei impegni : maestro . Prova a cambiare la base per il tuo confronto.

Fai clic su cambia base in questa pagina:

Ecco un esempio sulla pagina

Quindi puoi vedere tutti gli commit fatti a qualcuno / foobar dopo il giorno in cui l'hai biforcuta.

Fai clic su Crea richiesta pull :

Ecco una pagina di esempio

Assegna alla richiesta pull un titolo e forse una descrizione e fai clic su Crea richiesta pull .

Nella pagina successiva, scorrere fino alla fine della pagina e fare clic su Unisci richiesta pull e Conferma unione .

Il tuo repository Git me / foobar verrà aggiornato.

Modifica: le opzioni di rebase sono mostrate qui:

inserisci qui la descrizione dell'immagine


50
Questo è confuso perché quando si cambia il github di base ti lancia nella pagina per il repository originale, quindi sembra che tu stia aprendo una richiesta pull al fork a monte. Ma funziona totalmente.
Eduardo,

8
Per evitare la situazione confusa menzionata sopra, è meglio fare clic sul Editpulsante e passare manualmente base forkda me/foobare head forka someone/foobar. In questo modo è molto chiaro
macemers

26
Un altro: Funziona bene se non l'hai già fatto, ma dopo c'è il "merge commit" in cima alla cronologia dei tuoi commit. Pertanto "nulla da confrontare" non verrà visualizzato. Invece si deve usare il pulsante "Modifica" e scambiare manualmente base e fork per farlo funzionare.
Christian Gosch,

26
Non c'è modo di sbarazzarsi di quel ridicolo impegno di fusione?
Kumarharsh,

17
@kumar_harsh da settembre 2016 , ora esiste un'opzione "rebase and merge" per le richieste pull che evita il commit di merge.
waldyrious,

41
git remote set-url origin git@github.com:someone/foobar
git remote set-url origin --push git@github.com:me/foobar

C'è un avvertimento però:
questo è perfetto se sei l'unico a apportare modifiche alla forcella.
Tuttavia, se è condiviso con altre persone, potrebbe essere necessario estrarre dalla forcella, nel qual caso l'unica soluzione è un telecomando separato .

Modifica: in
realtà, è possibile git pull git@github.com:me/foobar , che rimuove l'avvertimento.
A te la scelta di quale è più facile da ricordare.


8

Ho usato un metodo abbastanza semplice usando l'interfaccia utente Web di GitHub per farlo:

  1. Apri il repository Git originale (non il repository Git biforcuto me/foobar)
  2. Passa alla cartella src e apri il file che desideri modificare
  3. Fai clic sull'icona della penna. Creerà automaticamente un'etichetta nel tuo fork personale denominata "patch-1" in base alla versione corrente del repository principale: Inserisci qui la descrizione dell'immagine
  4. Godere! Inserisci qui la descrizione dell'immagine

3
Provando questo, fondamentalmente apre l'editor sul file nel repository git originale. Non ho il privilegio di scrittura (in base alla progettazione) nel repository git originale. Sembra che per questo metodo sia necessario modificare il file, altrimenti non è possibile "salvare" il file. Senza salvare il file, non sono riuscito a visualizzare il tuo equivalente del ramo "patch-1" nel mio repository biforcato. Cosa mi sto perdendo qui?
Electro-Bunny,

5

L' app "Pull" è una soluzione automatica di impostazione e dimenticanza. Sincronizzerà il ramo predefinito del fork con il repository upstream.

Visita l'URL, fai clic sul pulsante verde "Installa" e seleziona i repository in cui desideri abilitare la sincronizzazione automatica.

Il ramo viene aggiornato una volta all'ora direttamente su GitHub, sul tuo computer locale devi estrarre il ramo principale per assicurarti che la tua copia locale sia sincronizzata.

Risposto anche in https://stackoverflow.com/a/58965171/946850 .


1

Un'altra opzione è quella di utilizzare il Update from upstreamRepoName/masterpulsante in GitHub per Mac (e presumo GitHub per Windows).

Inserisci qui la descrizione dell'immagine


TIL: che ci sono app per GitHub oltre l'interfaccia web :-) [ed è un peccato che l'esperienza attraverso di esse non sia unificata]
Tom Goodfellow,

Non vedo questo in Windows
Denis

1
@Denis questa è la loro vecchia app. Non sono sicuro che la loro nuova app ce l'abbia.
Steve Moser,

Aha. Funzionava in "GitHub Desktop" (per Mac, non sono sicuro di Windows).
michaelok,

0

Non so come si possa fare senza aggiungere un altro telecomando, tuttavia aggiungo sempre il repository da upstreamcui ho eseguito il fork come telecomando in modo da poter semplicemente fare:

git branch -a|grep remotes/upstream| while IFS="/" read p r b; do echo Syncing $r/$b to origin/$b; git push origin $r/$b:refs/heads/$b; done

Questo sincronizzerà tutti i rami incl. crearne di nuovi (rimuovere il refs/heads/per aggiornare solo le filiali esistenti). Se uno dei tuoi rami è divergente, verrà generato un errore per quel ramo.

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.