2013-05-07 13 views
7

Ho un repository su Github con 2 rami: master e develop.Come funziona git clone

Quando clonazione il repository ed eseguo $ git branch, viene visualizzato solo il ramo master.
Se corro $ git branch -a Posso vedere tutte le filiali remote.

Ora, se faccio un $ git checkout develop, ricevo il seguente messaggio:

branch develop istituito per monitorare ramo remoto sviluppare di origine.
passato a un nuovo ramo 'sviluppare'

Che cosa è realmente accaduto? Sono stati rilevati i commit dal ramo remoto develop quando ho eseguito $ git clone remote-url o quando sono stato eseguito: $ git checkout develop o nessuno dei due?

Devo fare un $ git pull origin develop dopo aver controllato develop, o è già finito?

Please help me capire come funziona clone quando ci sono più filiali sul remoto.

risposta

9

git clone recupera tutti i rami remoti, ma crea solo un ramo locale, master, per te. Così, quando si esegue git branch -a, vedrete qualcosa di simile:

$ git branch -a 
* master 
    remotes/origin/HEAD 
    remotes/origin/develop 
    remotes/origin/master 

il che significa che si ha una sezione locale master e diverse filiali remote. Quando hai eseguito git checkout develop, git crea un altro ramo locale develop a track ramo remoto origin/develop. git tenta di sincronizzare i rami di tracciamento, quindi non è necessario eseguire un altro pull dopo check out.

Se le terminologie di filiali locali e remote risultano confuse, è possibile navigare attraverso this document. Ha delle belle figure che ti aiutano a capirle e come si muovono i rami locali e remoti quando esegui ulteriori commit.

Potresti trovare questa risposta utile: How to clone all remote branches in Git?, la prima risposta.

+0

Grazie ragazzi, ognuno di voi. Ora ho capito. Perché ha la spiegazione più completa, accetto questa risposta. –

+0

Grazie, questo è utile. Un problema minore, tu dici "git prova a sincronizzare i rami di tracciamento, quindi non devi fare un altro tiro dopo il check out" che sembra suggerire che un checkout sincronizzerà i rami tracciati remoti come parte del processo. Questo non è il caso e solo un 'git fetch' recupererà gli aggiornamenti da un remoto (o' git pull' che usa fetch come prima parte del processo). Checkout utilizza semplicemente la copia locale esistente del ramo remoto. Il monitoraggio remoto collega solo i rami locali ai telecomandi per semplificare il comando quando si tira, non aggiunge alcuna sincronizzazione. – SuperDuperApps

1

Quando clonate un repository, otterrete tutti i rami e tutti i commit che possono essere raggiunti da uno di questi rami.

Tuttavia, non sarà possibile ottenere una succursale locale di qualsiasi altro ramo diverso dal master. Gli altri sono presenti come filiali remote (telecomandi/origine/sviluppo) e puoi verificarne uno qualsiasi quando vuoi. git imposterà quindi il tracciamento tra il ramo remoto e quello locale che hai creato al momento del check out.

6

git clone crea innanzitutto un nuovo repository vuoto. (come git init)

Quindi imposta il repository dato come remoto chiamato "origine".(git remote add)

Il lavoro principale viene quindi eseguito da git fetch, che è l'unico comando che comunica con altri repository. Trasferisce tutti i commit dell'archivio remoto nel repository corrente e crea all'interno dei rami del repository locale a partire da "remote/origin /" corrispondenti ai rami sul repository remoto.

Se si dispone di un repository non nudo predefinito, chiamerà anche git checkout per effettuare il checkout di solito sul ramo principale.

Se si chiama git branch -r, verranno visualizzate le filiali "remote", ovvero quelle filiali nel repository, che verranno aggiornate entro git fetch. (Non si lavora mai direttamente su questi dati.)

Ogni volta che si desidera lavorare su un ramo si utilizza git checkout che creerà una copia di tale ramo, senza il prefisso "remoto/origine /". Quelli sono i rami "locali" su cui lavori. (git branch mostrerà quelli)

Quasi tutto ciò che fai coinvolgerà solo il tuo repository locale. L'unica eccezione è git push, che è l'unico comando per aggiornare i repository remoti e git fetch che è l'unico comando per interrogare altri repository.

git pull è solo la combinazione di git fetch e git merge. Il primo recupera le modifiche e aggiorna remote/origin/* e il secondo unisce queste modifiche al ramo locale.

0

Per dirla semplicemente, git clone repository-url fa le seguenti cose, in ordine:

  1. Crea un nuovo repository vuota. (git init)
  2. Imposta il repository dato come remoto chiamato "origine". (git remote add all'origine repository-url)
  3. Blocca tutti i commit e le diramazioni remote dal remoto chiamato "origine". (git fetch --tutti)
  4. Crea un locale maestro ramo per monitorare il telecomando ramo origin/master (git checkout --track origin/master)

Un punto interessante è che un fork (in github o bitbucket), è solo un clone lato server.