Come estrarre un ramo remoto dal repository di qualcun altro


277

Ho un progetto ospitato su GitHub che qualcuno ha biforcato. Sul loro fork, hanno creato un nuovo ramo "foo" e apportato alcune modifiche. Come faccio a inserire il loro "pippo" in un nuovo ramo chiamato anche "pippo" nel mio repository?

Capisco che potrebbero inviarmi una richiesta pull, ma mi piacerebbe avviare questo processo da solo.

Assumi quanto segue:

  1. Poiché hanno biforcato il mio progetto, entrambi i nostri repo condividono la stessa "storia"
  2. Sebbene GitHub mostri che il loro progetto è stato biforcato dal mio, il mio repository locale non ha alcun riferimento al progetto di questa persona. Devo aggiungere il loro come telecomando?
  3. Non ho ancora un ramo chiamato "foo" - non so se devo prima crearlo manualmente.
  4. Voglio decisamente che questo venga inserito in un ramo separato e non il mio maestro.

Risposte:


371
git remote add coworker git://path/to/coworkers/repo.git
git fetch coworker
git checkout --track coworker/foo

Questo configurerà un ramo locale foo, monitorando il ramo remoto coworker/foo. Quindi, quando il tuo collega ha apportato alcune modifiche, puoi facilmente estrarle:

git checkout foo
git pull

Risposta ai commenti:

Fantastico :) E se volessi apportare le mie modifiche a quel ramo, dovrei creare una seconda "barra" del ramo locale da "foo" e lavorare lì invece che direttamente sul mio "foo"?

Non è necessario creare un nuovo ramo, anche se lo consiglio. Potresti anche impegnarti direttamente fooe chiedere al tuo collega di tirare il tuo ramo. Ma quel ramo esiste già e il tuo ramo foodeve essere configurato come ramo a monte per esso:

git branch --set-upstream foo colin/foo

supponendo che il colintuo repository (un remoto per il repository dei tuoi colleghi) sia definito in modo simile:

git remote add colin git://path/to/colins/repo.git

4
È stato molto veloce :) Potresti aggiungere che dovrebbe usare l' git://URL dalla pagina del repository GitHub dell'altra persona al posto di //path/to/coworkers/repo.git. (Descrivere questo è stato ciò che ha reso la mia risposta troppo lenta;))
Mark Longair

Fantastico :) E se volessi apportare le mie modifiche a quel ramo, dovrei creare una seconda "barra" del ramo locale da "foo" e lavorare lì invece che direttamente sul mio "foo"?
Colin O'Dell

O è sicuro lavorare direttamente nel mio "foo" e tirare / unire le sue modifiche in un secondo momento? Qual è la migliore pratica qui?
Colin O'Dell

1
Perfetto, è esattamente quello che stavo cercando :) Grazie per il tuo aiuto !!
Colin O'Dell

1
Bella risposta in 3 minuti!
Tieme

113

No, non è necessario aggiungerli come telecomando. Sarebbe ingombrante e un dolore da fare ogni volta.

Afferrare i loro impegni:

git fetch git@github.com:theirusername/reponame.git theirbranch:ournameforbranch

Questo crea un ramo locale denominato ournameforbranchche è esattamente lo stesso di quello che theirbranchera per loro. Per l'esempio della domanda, l'ultimo argomento sarebbe foo:foo.

La :ournameforbranchparte nota può essere ulteriormente tralasciata se pensare a un nome che non sia in conflitto con uno dei propri rami è fastidioso. In tal caso, FETCH_HEADè disponibile un riferimento chiamato . Puoi git log FETCH_HEADvedere i loro commit e poi fare cose come cherry-pickedscegliere i loro commit.

Spingendolo indietro a loro:

Spesso, vuoi aggiustare qualcosa di loro e respingerlo subito. Anche questo è possibile:

git fetch git@github.com:theirusername/reponame.git theirbranch
git checkout FETCH_HEAD

# fix fix fix

git push git@github.com:theirusername/reponame.git HEAD:theirbranch

Se lavorare in uno stato distaccato ti preoccupa, crea con tutti i mezzi un ramo usando :ournameforbranche sostituisci FETCH_HEADe HEADsoprattutto con ournameforbranch.


2
Grazie per questo, l'altra risposta non funziona se sia tu che l'altra persona avete rami con lo stesso nome (come il masterramo predefinito )
Giobbe

2
Vale la pena ricordare che questo metodo non funzionerà se non hai elementi come la chiave SSH associata al tuo account GitHub, vedi stackoverflow.com/questions/12940626
Przemek D

1
non devi essere aggiunto come collaboratore in modo da poter inviare il push al loro repo?
Honey

1
@ Miele Certamente! Il push presuppone che tu abbia le autorizzazioni necessarie sull'estremità remota per eseguire il push. Allo stesso modo, il recupero presuppone che il percorso sia accessibile.
antak

Se esegui git branch -m newbranchin questo stato disconnesso, git perderà la testa e inizierà a dire che il tuo repository non è più valido. git initsembra risolverlo e rimetterti più o meno nello stato in cui eri prima, con il ramo denominato "newbranch".
Ian Hickson

14

Se la risposta di antak:

git fetch git@github.com:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 

ti dà:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Quindi (seguendo il consiglio di Przemek D) utilizzare

git fetch https://github.com/<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH>

8

Quella che segue è una bella soluzione utile che funziona con GitHub per controllare il ramo PR dal fork di un altro utente. È necessario conoscere l'ID della richiesta pull (che GitHub visualizza insieme al titolo PR).

Esempio:

Risolvendo il tuo codice insicuro # 8,
alice vuole unire 1 commit in your_repo:masterdaher_repo:branch

git checkout -b <branch>
git pull origin pull/8/head

Sostituisci il tuo telecomando se diverso da origin.
Sostituisci 8con l'ID di richiesta pull corretto.


3
Questo ha bisogno di più voti positivi. funziona perfettamente ed ha evitato l'errore "fatale: impossibile trovare ref remoto" che stavo ottenendo con la risposta più votata. Grazie!
Michael Romrell

1
2 righe di codice facile. Grazie per aver condiviso questo! L'unica cosa più dolce di questa è unire gli aggiornamenti nella loro richiesta pull in modo semplice.
klewis

5

GitHub ha una nuova opzione relativa alle risposte precedenti, basta copiare / incollare le righe di comando dal PR:

  1. Scorri fino alla fine del PR per visualizzare il pulsante MergeoSquash and merge
  2. Fare clic sul collegamento a destra: view command line instructions
  3. Premere l'icona Copia a destra del passaggio 1
  4. Incolla i comandi nel tuo terminale

2

Se il repo biforcuto è protetto in modo da non poterlo inserire direttamente e il tuo obiettivo è apportare modifiche al loro foo, allora devi inserire il loro branch foo nel tuo repository in questo modo:

git remote add protected_repo https://github.com/theirusername/their_repo.git
git fetch protected_repo 
git checkout --no-track protected_repo/foo

Ora hai una copia locale di foo a cui non è associato alcun upstream. Puoi eseguire il commit delle modifiche (o meno) e quindi inviare il tuo foo al tuo repository remoto.

git push --set-upstream origin foo

Ora foo è nel tuo repository su GitHub e il tuo foo locale lo sta monitorando. Se continuano ad apportare modifiche a foo, puoi recuperare i loro e unirli al tuo foo.

git checkout foo 
git fetch protected_repo
git merge protected_repo/foo
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.