Qual'è la differenza tra pull e clone in git?


237

Qual è la differenza tra fare (dopo mkdir repoe cd repo):

git init
git remote add origin git://github.com/cmcculloh/repo.git
git fetch --all
git pull origin master

e

git clone git://github.com/cmcculloh/repo.git

Voglio dire, ovviamente uno è più corto, ma a parte questo stanno praticamente facendo la stessa cosa?

Risposte:


122

Sono sostanzialmente uguali, tranne per il clone che imposterà rami di tracciamento remoto aggiuntivi, non solo master. Dai un'occhiata alla pagina man :

Clona un repository in una directory appena creata, crea rami di tracciamento remoto per ogni ramo nel repository clonato (visibile usando git branch -r) e crea e verifica un ramo iniziale che viene biforcato dal ramo attualmente attivo del repository clonato.


10
git fetch --all imposta ulteriori rami di tracciamento remoto, quindi sostanzialmente sono uguali.
cmcculloh

251

git cloneè come ottenere una copia locale di un repository esistente su cui lavorare. Di solito viene utilizzato una sola volta per un determinato repository, a meno che non si desideri disporre di più copie funzionanti di esso. (O vuoi ottenere una copia pulita dopo aver incasinato quello locale ...)

git pull(o git fetch+ git merge) è il modo in cui aggiorni quella copia locale con nuovi commit dal repository remoto. Se stai collaborando con altri, è un comando che eseguirai frequentemente.

Come mostra il tuo primo esempio, è possibile emulare git clonecon un assortimento di altri comandi git, ma non è proprio il caso che git pullsta facendo "sostanzialmente la stessa cosa" di git clone(o viceversa).


4
Che cosa sta facendo quel clone git che non viene realizzato dalla sequenza di comandi che comportava "git pull"?
cmcculloh,

21
@cmcculloh: Nothing - la sequenza che descrivi realizza efficacemente ciò che fa "git clone". Il punto è che "git pull" è usato per fare una varietà di cose oltre a quello che hai fatto lì - per non dire che "git pull" è in realtà esattamente la combinazione di "git fetch; git merge <ramo corrente> <origine / ramo corrente> ". IOW, potresti vivere senza cloni e tirare se lo desideri davvero. Inoltre, puoi estrarre da repository diversi da quello da cui hai clonato. Mi piace pensare a "clone" come "fammi una copia locale di quel repository" e "pull" come "procurami gli aggiornamenti da un determinato telecomando".
ebneter,

120

In laici possiamo dire:

  • Clone : ottieni una copia funzionante del repository remoto.
  • Pull : ci sto lavorando, per favore fammi conoscere le nuove modifiche che potrebbero essere aggiornate da altri.

3
Penso che la tua definizione di Pull possa essere detta anche per Clone
henrywright il

10
Come puoi lavorare su qualcosa che non hai clonato?
Jyoti Prakash,

Non capisco cosa intendi?
henrywright,

Speranza di @henrywright, la risposta di ebneter risponderà alla tua domanda
Mrk

41

git clone significa che stai facendo una copia del repository nel tuo sistema.

git fork significa che stai copiando il repository sul tuo account Github.

git pull significa che stai recuperando l'ultimo repository modificato.

git push significa che stai restituendo il repository dopo averlo modificato.

In parole povere:

git clonesta scaricando ed git pullè rinfrescante.


9

clone : copia del repository del server remoto sul tuo computer locale.

pull : ottieni nuove modifiche altre aggiunte al tuo computer locale.

Questa è la differenza

Il clone viene generalmente utilizzato per ottenere una copia repository remota.

Pull viene utilizzato per visualizzare il codice aggiunto di altri compagni di squadra, se si lavora in gruppo.


5

git clone viene usato per scaricare esattamente ciò che sta attualmente lavorando sul repository del server remoto e salvarlo nella cartella della macchina in cui è posizionato quel progetto. Principalmente viene utilizzato solo quando stiamo per caricare il progetto per la prima volta. Dopo questo pull è l'opzione migliore.

git pull è fondamentalmente un'operazione (clone (download) + unione) e usata principalmente quando lavori come lavoro di squadra. In altre parole, quando vuoi le modifiche recenti in quel progetto, puoi tirare.


3

Miss Clone: ​​ottengo una nuova copia in locale.

Signor Pull: l'ho già localmente, lo aggiorno e basta.


Miss Clone: ​​posso fare quello che fai! Sei solo il mio sottoinsieme.

Signor Pull: Idem!


Miss Clone: ​​No, non si crea. Questo è ciò che faccio:

  1. Crea un repository vuoto vuoto
  2. Popola filiali di tracciamento remoto
  3. Esegui git fetch senza argomenti

Fai solo il n. 3 e poi ti unisci, cosa che non ho bisogno di fare (la mia è fresca).

Signor Pull: pantaloni intelligenti, niente male, prima farò un "git init"! Quindi siamo uguali. Inoltre, ho la capacità extra di "fusione" sui repository esistenti! Il che mi rende il comando più usato in Git;)


Creatori Git: trattieni i tuoi cavalli Mr Pull, se --bare o --mirror viene usato con clone o init, la tua unione non avverrà. Rimane di sola lettura.


Risposta sottovalutata.
sinekonata,

2

Hmm, cosa manca per vedere il ramo remoto "4.2" quando tiro, come faccio quando clonare? Qualcosa non è chiaramente identico.

tmp$  mkdir some_repo

tmp$  cd some_repo

some_repo$  git init
Initialized empty Git repository in /tmp/some_repo/.git/

some_repo$  git pull https://github.ourplace.net/babelfish/some_repo.git
  :
From https://github.ourplace.net/babelfish/some_repo
 * branch            HEAD       -> FETCH_HEAD

some_repo$  git branch
* master

vs

tmp$  rm -rf some_repo

tmp$  git clone https://github.ourplace.net/babelfish/some_repo.git
Cloning into 'some_repo'...
  :
Checking connectivity... done.

tmp$  cd some_repo

some_repo$  git branch
* 4.2

L'ho notato anche io e sospetto che il problema siano le modifiche alle impostazioni predefinite git nel tempo. Ho 1.9.5.msysgit su Windows e 2.3.2-Applegit-55 su un Mac.
AnneTheAgile,

2

git clone URL ---> Il progetto o il repository completo verrà scaricato come directory separata. e non solo le modifiche git pull URL ---> fetch + merge -> Recupererà solo le modifiche che sono state apportate e non l'intero progetto


1

Mentre il git fetchcomando recupererà tutte le modifiche sul server che non hai ancora, non modificherà affatto la tua directory di lavoro. Otterrà semplicemente i dati per te e ti consentirà di unirli tu stesso. Tuttavia, esiste un comando chiamato git pullche è essenzialmente git fetchimmediatamente seguito da a git mergenella maggior parte dei casi.

Per saperne di più: https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Pulling


1
Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
ekad,

0

Clona : crea una copia esattamente duplicata del progetto di repository remoto nel computer locale.

Pull -: supponiamo che due o più di due persone condividano lo stesso repository. (Supponiamo che il nome di un'altra persona sia Syam) (Un repository è un luogo in cui esiste il tuo progetto in Github) Quindi, se Syam fa alcune modifiche nello stesso progetto nel suo locale e lo spinge nel repository remoto Quindi, qualunque siano le modifiche che Syam ha fatto, quelle modifiche saranno non riflettere nel tuo locale. Quindi, per riflettere quei nuovi cambiamenti nel tuo locale devi usare git pull. Nel complesso usiamo git pull per aggiornare il progetto.

Quindi fondamentalmente usiamo git clone solo una volta mentre usiamo git pull molte volte.

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.