Koja je razlika između 'git pull' i 'git fetch'?

Bilješka moderatora. S obzirom da je šezdeset sedam odgovora već poslano na ovo pitanje (neki su izbrisani), razmislite o tome dodajete li nešto novo prije slanja drugog.

Koje su razlike između git pull i git fetch ?

10500
15 нояб. set pupeno 15 nov. 2008-11-15 12:51 '08 u 12:51 2008-11-15 12:51
@ 46 odgovora
  • 1
  • 2

U najjednostavnijem smislu, git pull izvodi git fetch nakon kojeg slijedi git merge .

Možete napraviti git fetch u bilo koje vrijeme da biste ažurirali grane za daljinsko praćenje u refs/remotes/<remote>/ .

Ova operacija nikada ne mijenja bilo koju od vaših lokalnih ogranaka u refs/heads i sigurno je bez promjene radne kopije. Čak sam čuo da ljudi povremeno pokreću git fetch u cron poslu u pozadini (iako ga ne bih preporučio).

git pull je ono što biste učinili kako biste ažurirali lokalnu podružnicu daljinskom verzijom, kao i ažurirali druge grane za daljinsko praćenje.

Git dokumentacija: Git pull

8755
15 нояб. Odgovor koji je dao Greg Hewgill 15. studenog 2008-11-15 12:52 '08 u 12:52 2008-11-15 12:52
  • Kada koristite pull , Git pokušava automatski obaviti vaš posao za vas. To je osjetljivo na kontekst , tako da će Git objediniti sve push naredbe u granu na kojoj trenutno radite. pull automatski spaja, ne dopuštajući da ih prvo vidiš.Ako nisi jako dobar u upravljanju svojim granama, možeš naići na česte sukobe.

  • Kada fetch , Git prikuplja sve naredbe iz ciljne grane koje ne postoje u vašoj trenutnoj grani, ali ih pohranjuju u vašem lokalnom spremištu . Međutim, ne kombinira ih s vašom trenutnom granom . To je osobito korisno ako trebate stalno ažurirati svoje spremište, ali radite na onome što se može pokvariti ako ažurirate svoje datoteke. Da biste integrirali urezivanje u glavnu granu, koristite merge .

border=0
1919
18 авг. odgovor od Mouna Cheikhna 18 aug. 2011-08-18 11:53 '11 u 11:53 2011-08-18 11:53

Važno je suprotstaviti filozofiju git dizajna filozofiji tradicionalnog alata za upravljanje izvorima, kao što je SVN.

Subverzija je dizajnirana i izgrađena pomoću modela klijent / poslužitelj. Postoji jedno spremište, koje je poslužitelj, a nekoliko klijenata može izdvojiti kod s poslužitelja, raditi s njim, a zatim ga vratiti na poslužitelj. Pretpostavlja se da klijent uvijek može kontaktirati poslužitelja kada treba izvršiti operaciju.

Git je dizajniran kako bi podržao više distribuirani model bez potrebe za centralnim spremištem (iako ga sigurno možete koristiti ako želite). Također, git je dizajniran na takav način da klijent i "poslužitelj" ne bi trebali biti online istovremeno. Git je dizajniran tako da ljudi na nepouzdanoj vezi mogu čak i razmijeniti kod putem e-pošte. Možete potpuno onemogućiti rad i snimiti CD kako biste razmijenili kod putem git-a.

Da bi podržao ovaj model, git održava lokalni repozitorij s vašim kodom, kao i dodatno lokalno spremište koje odražava stanje udaljenog spremišta. Lokalno pohranjivanje kopije udaljenog spremišta, git može odrediti potrebne promjene, čak i ako udaljeno spremište nije dostupno. Kasnije, kada trebate poslati promjene nekom drugom, git ih može prenijeti kao skup promjena od trenutka poznatog u udaljeno spremište.

  • git fetch je naredba koja kaže: "Donesite moju lokalnu kopiju udaljenog spremišta na datum."

  • git pull kaže: "Donesite promjene u udaljeno spremište gdje čuvam vlastiti kod."

Obično, git pull to radi pokretanjem git fetch za ažuriranje lokalne kopije udaljenog repozitorija, a zatim spajanje promjena u vaše vlastito spremište koda i moguće radnu kopiju.

Uklonite ovo kako biste imali na umu da na vašoj radnoj stanici često postoje najmanje tri kopije projekta. Jedna kopija je vaše vlastito spremište s vlastitom poviješću urezivanja. Drugi primjerak je vaša radna kopija, gdje se uređuje i gradi. Treća kopija je vaša lokalna "predmemorirana" kopija udaljenog spremišta.

1066
31 марта '13 в 21:43 2013-03-31 21:43 odgovor je dao MikeD 31. ožujka '13 u 21:43 2013-03-31 21:43
711
09 июня '15 в 16:30 2015-06-09 16:30 odgovor je dan 9. lipnja '15. u 16:30 sati 2015-06-09 16:30

Jedna upotreba git fetch je da vam sljedeća poruka govori o svim promjenama u udaljenoj grani od posljednjeg povlačenja ... tako da možete provjeriti prije nego izvršite stvarnu povlačenje, što može promijeniti datoteke u vašoj trenutnoj grani i pokrenuti kopiju ,

 git fetch git diff ...origin 
437
07 мая '10 в 22:23 2010-05-07 22:23 odgovor je dat Mepster 07. svibnja '10 u 10:23 AM 2010-05-07 22:23

Morao sam malo razumjeti koja je razlika, ali ovo je jednostavno objašnjenje. master u vašem localhost je grana.

Kada klonirate spremište, dobivate cijelo spremište za lokalni host. To znači da u ovom trenutku imate početni / glavni pokazivač na HEAD i master koji pokazuje na istu HEAD .

kada počnete raditi i to učinite, premjestite glavni pokazivač na HEAD + vaše fiksacije. No, pokazivač podrijetla / majstora još uvijek pokazuje što je to bilo kada ste klonirali.

Dakle, razlika će biti:

  • Ako pokrenete git fetch , jednostavno će izdvojiti sve promjene u udaljenom spremištu ( GitHub ) i premjestiti početni / glavni pokazivač na HEAD . U međuvremenu, čarobnjak za lokalnu podružnicu nastavit će označavati gdje se nalazi.
  • Ako učinite git pull , u osnovi će izdvojiti (kao što je objašnjeno ranije) i spojiti sve nove promjene u glavnu granu i pomaknuti pokazivač na HEAD .
347
11 мая '12 в 21:37 2012-05-11 21:37 odgovor je dao Gerardo 11. svibnja '12 u 21:37 2012-05-11 21:37

Ponekad vizualna prezentacija pomaže.

2019

25 янв. odgovor je dao pasivni putnik 25. siječnja 2016-01-25 20:28 '16 u 20:28 2016-01-25 20:28

ukratko

git fetch je sličan pull ali se ne spaja. odnosno izdvaja udaljena ažuriranja ( refs i objects ), ali vaš lokalni ostaje nepromijenjen (tj. origin/master ažuriran, ali master ostaje isti).

git pull ispao iz konzole i odmah se stapa.

veći

klonovi git clone klonova.

git rebase sprema materijal iz vaše trenutne grane koja nije u uzlaznoj grani na privremeno područje. Vaša je nit sada ista kao i prije nego što ste pokrenuli promjene. Tako će git pull -rebase izvući izbrisane promjene, premotati vašu lokalnu granu, ponoviti jednu po jednu promjene na vrhu tekuće grane, sve dok ne budete u toku s najnovijim razvojima.

Osim toga, git branch -a će vam pokazati točno ono što se događa sa svim vašim granama - lokalnim i udaljenim.

Ovaj blog post bio je od pomoći:

Razlika između git pull, git fetch i git clone (i git rebase) - Mike Pierce

i pokriva git pull , git fetch , git clone i git rebase .

====

UPDATE

Mislila sam da je ažuriram kako bih vam pokazala kako ste je koristili u praksi.

  1. Ažurirajte svoj lokalni repo s udaljenog uređaja (ali ne ujedinite):

     git fetch 
  2. Nakon preuzimanja ažuriranja pogledajte razlike:

     git diff master origin/master 
  3. Ako ste zadovoljni s tim ažuriranjima, spojite:

     git pull 

bilješke:

U 2. koraku: Više informacija o razlikama između lokalnih i udaljenih uređaja potražite u odjeljku: Kako usporediti lokalnu git granu s udaljenom granom?

U trećem koraku: Najvjerojatnije je točnije (na primjer, u repo) koji se brzo mijenja kako bi se git rebase origin . Pogledajte @ Justin Ohms Komentirajte u drugom odgovoru.

Vidi također: http://longair.net/blog/2009/04/16/git-fetch-and-merge/

170
13 апр. Odgovori Snowcrash 13. tra 2013-04-13 20:31 '13 u 20:31 2013-04-13 20:31
 git-pull - dohvati i spaja se s drugim repozitorijem ili lokalnom podružnicom SADRŽAJ git pull ... OPIS Pokreće git-fetch  preuzeta glava (e) u trenutnu granu.  Uz --rebase, poziva git-rebase  umjesto git-spajanja. Imajte na umu da možete koristiti.  (trenutni direktorij) kao <repository> za izvlačenje  iz lokalnog spremišta - to je korisno pri spajanju lokalnih ogranaka  u trenutnu granu. Također imajte na umu da se opcije značilo za sebe i temeljne GIT-spajanje git-pull  za git-fetch.

Ti bi povukao, ako želiš da se priče spajaju, dobila bi ako si samo "htjela kod", jer su neki od njih stavili neke članke ovdje.

161
15 нояб. Odgovor dao Vinko Vrsalović 15. studenog 2008-11-15 12:52 '08 u 12:52 2008-11-15 12:52

Možete izvući iz udaljenog spremišta, vidjeti razlike, a zatim povući ili spojiti.

Ovo je primjer udaljenog repozitorija pod nazivom origin i master naziv grane, koji prati udaljenu origin/master granu:

 git checkout master git fetch git diff origin/master git rebase origin master 
147
21 марта '11 в 14:07 2011-03-21 14:07 odgovor je dao Antonio Bardazzi 21. ožujka '11 u 14:07 2011-03-21 14:07

Kratak i jednostavan odgovor je da je git pull samo git fetch i git merge .

Vrlo je važno napomenuti da se git pull automatski spaja, sviđalo se to vama ili ne . To, naravno, može dovesti do spajanja sukoba. Recimo da je vaša konzola origin a vaša grana je master . Ako ste git diff origin/master prije povlačenja, trebali biste biti svjesni mogućih sukoba spajanja i sukladno tome pripremiti svoju lokalnu podružnicu.

Uz povlačenje i klikanje, neki tijekovi rada uključuju git rebase , na primjer, ovaj, koji parafraziram iz srodnog članka:

 git pull origin master git checkout foo-branch git rebase master git push origin foo-branch 

Ako se nađete u takvoj situaciji, možda ćete biti u iskušenju zbog git pull --rebase . Ako doista ne znate što radite, savjetovao bih vam da to učinite. Ovo je upozorenje s man stranice za git-pull , verzija 2.3.5 :

To je potencijalno opasan način rada. Prerađuje priču koja ne sluti na dobro kada ste već objavili ovu priču. Nemojte koristiti ovaj parametar ako niste pažljivo pročitali git-rebase (1).

139
15 мая '11 в 23:53 2011-05-15 23:53 odgovor je dao jfmercer 15. svibnja '11 u 23:53 2011-05-15 23:53

2019

117
06 февр. odgovor je dan 06. veljače. 2015-02-06 14:48 '15 u 14:48 2015-02-06 14:48

Evo nekih informacija o git pull i git fetch , tako da možete razumjeti stvarne razlike ... u nekoliko jednostavnih riječi, dohvat dobiva najnovije podatke, ali ne mijenja kod i neće kontaktirati vaš trenutni kod lokalne podružnice, ali izvlači kod s promjenama i spojite ga u vašu lokalnu podružnicu, pročitajte dalje da biste dobili detaljnije informacije o svakoj od njih

git fetch

Preuzet će sve veze i objekte i sve nove ogranke u vaše lokalno spremište ...

Odaberite grane i / ili oznake (zajedno, "refs") iz jednog ili više drugih spremišta, zajedno s objektima potrebnim za dovršavanje njihovih priča. Ažurirane grane za daljinsko praćenje (pogledajte opis u nastavku za načine kontrole tog ponašanja).

Prema zadanim postavkama, bilo koja oznaka koja ukazuje na izvučene priče također je dohvaćena; učinak je izvući oznake koje upućuju na grane koje vas zanimaju. Ovo zadano ponašanje može se promijeniti pomoću opcija - oznaka ili --no-tags ili postavljanjem daljinskog upravljača. Koristeći refspec, koji izričito izdvaja oznake, možete izdvojiti oznake koje ne upućuju na grane koje vas zanimaju.

git fetch se može dohvatiti iz jednog imenovanog repozitorija ili URL-a, ili iz nekoliko spremišta odjednom, ako je dano, i postoje konzole. pisati u konfiguracijsku datoteku. (Pogledajte Git-config 1 ).

Ako nije naveden udaljeni uređaj, koristi se zadani izvorni izvor, osim ako se za trenutnu granu konfigurira uzvodna grana.

Nazivi veza koje su odabrane, zajedno s imenima objekata na koje upućuju, zabilježene su u.git / FETCH_HEAD. Ove informacije mogu koristiti skripte ili druge git naredbe, kao što je git-pull.


git pull

Primjenjivat će promjene s udaljene na trenutnu granu u lokalnoj

Uključuje promjene iz udaljenog spremišta u trenutnu granu. U zadanom načinu, git pull je skraćenica za git fetch, a slijedi git spajanje FETCH_HEAD.

Točnije, git pull pokreće git dohvat s danim parametrima i poziva git spajanje za spajanje primljenih zaglavlja grana u trenutnu granu. Pomoću --rebase pokreće git rebase umjesto git stapanja.

treba biti ime udaljenog repozitorija proslijeđenog git-fetch 1 . može nazvati proizvoljni udaljeni ref (na primjer, naziv oznake) ili čak zbirku veza s odgovarajućim udaljenim granama za praćenje (na primjer, refs / heads /: refs / remotes / origin /), ali obično je to naziv podružnice u udaljenom spremištu.

Zadane vrijednosti za i čitaju se iz "udaljenih" i "spajanje" konfiguracija za trenutnu granu, kao što je postavljeno od git-branch --track.


Također sam stvorio vizualnu sliku ispod kako bih vam pokazao kako git fetch i git pull zajedno rade ...

2019

bonus:

Govoreći o istezanju i izvlačenju gore navedenih odgovora, želio bih podijeliti zanimljiv trik,

git pull --rebase

Ova naredba je najkorisnija naredba u mom životu, što je uštedjelo puno vremena.

Prije nego što pokrenete nove naredbe na poslužitelj, isprobajte ovu naredbu i ona će automatski sinkronizirati najnovije promjene poslužitelja (koristeći fetch + spajanje) i staviti vašu poruku na početak u git dnevnik. Nema potrebe brinuti se o ručnom povlačenju / spajanju.

Pronađite informacije na: http://gitolite.com/git-pull--rebase

113
23 дек. Odgovor je dao Sazzad Hissain Khan 23. prosinca. 2015-12-23 18:31 '15 u 18:31 2015-12-23 18:31

Volim imati neku vrstu vizualnog prikaza situacije kako bih razumio te stvari. Možda bi to željeli vidjeti i drugi programeri, pa je ovdje moj dodatak. Nisam sasvim siguran da je sve ispravno, stoga vas molimo da komentirate ako pronađete bilo kakve pogreške.

  LOCAL SYSTEM . ===================================================== ================= . ================= =================== ============= REMOTE REPOSITORY . REMOTE REPOSITORY LOCAL REPOSITORY WORKING COPY (ORIGIN) . (CACHED) for example, . mirror of the a github repo. . remote repo Can also be . multiple repo . . . FETCH *------------------>* Your local cache of the remote is updated with the origin (or multiple external sources, that is git distributed nature) . PULL *-------------------------------------------------------->* changes are merged directly into your local copy. when conflicts occur, you are asked for decisions. . COMMIT . *<---------------* When coming from, for example, subversion, you might think that a commit will update the origin. In git, a commit is only done to your local repo. . PUSH *<---------------------------------------* Synchronizes your changes back into the origin. 

Neke od glavnih prednosti posjedovanja zrcalne slike konzole su:

  • Izvedba (pomicanje svih poruka i poruka bez pokušaja komprimiranja putem mreže)
  • Povratne informacije o statusu vašeg lokalnog repoa (na primjer, koristim Atlassian SourceTree, koji će mi dati žarulju koja označava hoću li ići naprijed ili natrag u odnosu na izvor. Ažuriraj sa GIT FETCH).
107
20 февр. Odgovor daje Justus Romijn 20. veljače. 2014-02-20 00:18 '14 u 0:18 2014-02-20 00:18

Također sam se s tim borila. Zapravo, došao sam s Googleovim pretraživanjem za točno isto pitanje. Nakon što sam pročitala sve te odgovore, napokon sam nacrtala sliku u glavi i odlučila sam pokušati riješiti stanje 2 spremišta i 1 pješčanik, te akcije koje su se izvodile s vremenom, gledajući njihovu verziju. To je ono što sam smislio. Ispravite me ako sam zabrljao.

Tri spremišta s uzorkom:

 --------------------- ----------------------- ----------------------- - Remote Repo - - Remote Repo - - Remote Repo - - - - gets pushed - - - - @ R01 - - @ R02 - - @ R02 - --------------------- ----------------------- ----------------------- --------------------- ----------------------- ----------------------- - Local Repo - - Local Repo - - Local Repo - - pull - - - - fetch - - @ R01 - - @ R01 - - @ R02 - --------------------- ----------------------- ----------------------- --------------------- ----------------------- ----------------------- - Local Sandbox - - Local Sandbox - - Local Sandbox - - Checkout - - new work done - - - - @ R01 - - @ R01+ - - @R01+ - --------------------- ----------------------- ----------------------- 

Tri spremišta s opterećenjem

 --------------------- ----------------------- ----------------------- - Remote Repo - - Remote Repo - - Remote Repo - - - - gets pushed - - - - @ R01 - - @ R02 - - @ R02 - --------------------- ----------------------- ----------------------- --------------------- ----------------------- ----------------------- - Local Repo - - Local Repo - - Local Repo - - pull - - - - pull - - @ R01 - - @ R01 - - @ R02 - --------------------- ----------------------- ----------------------- --------------------- ----------------------- ----------------------- - Local Sandbox - - Local Sandbox - - Local Sandbox - - Checkout - - new work done - - merged with R02 - - @ R01 - - @ R01+ - - @R02+ - --------------------- ----------------------- ----------------------- 

To mi je pomoglo razumjeti zašto je uzorkovanje vrlo važno.

95
17 июля '12 в 19:43 2012-07-17 19:43 odgovor je dan pn1 dude 17. srpnja '12 u 19:43 2012-07-17 19:43

Razlika između GIT Fetch i GIT Pull može se objasniti sljedećim scenarijem: (Prisjećajući se da slike govore glasnije od riječi! Dao sam grafički prikaz)

Pretpostavimo da radite na projektu s članovima vašeg tima. Dakle, oni će biti jedna od glavnih podjela projekta, a svi sudionici moraju se odvojiti u vlastitom lokalnom repozitoriju, a zatim raditi na ovoj lokalnoj podružnici kako bi promijenili / dodali module, a zatim se vratili u glavnu granu.

Dakle, početno stanje dviju grana, kada forkirate glavni projekt u vašem lokalnom repozitoriju, bit će ovako - ( A , B i C su moduli koji su već završeni u projektu)

2019

ответ дан Aman Tiwari 07 февр. '17 в 17:15 2017-02-07 17:15