Vraag Wat is het verschil tussen 'git pull' en 'git fetch'?


Moderator Opmerking: Gezien het feit dat deze vraag al heeft plaatsgevonden vierenzestig antwoorden erop geplaatst, overweeg of u wel of niet bent iets nieuws toevoegen voordat je een nieuwe post plaatst.

Wat zijn de verschillen tussen git pull en git fetch?


10125
2017-11-15 09:51


oorsprong


antwoorden:


In de eenvoudigste bewoordingen, git pull doet een git fetch gevolgd door een git merge.

Je kunt een git fetch op elk gewenst moment om uw remote tracking-afdelingen bij te werken refs/remotes/<remote>/.

Deze bewerking wijzigt nooit een van uw eigen lokale vestigingen onder refs/heads, en is veilig om te doen zonder uw werkkopie te veranderen. Ik heb zelfs gehoord van mensen die rennen git fetch periodiek in een cron-baan op de achtergrond (hoewel ik niet zou aanraden dit te doen).

EEN git pull is wat u zou doen om een ​​lokale vestiging up-to-date te houden met de externe versie, terwijl u ook uw andere remote tracking-vestigingen bijwerkt.

Git-documentatie: git pull


8455
2017-11-15 09:52



  • Wanneer je gebruikt pull, Git probeert automatisch je werk voor je te doen. Het is contextgevoelig, dus Git zal alle getrokken commits samenvoegen in de branch waar je momenteel aan werkt. pull  voegt automatisch de commits samen zonder dat u ze eerst nakijkt. Als u uw vestigingen niet goed beheert, kunt u regelmatig tegenstrijdigheden aangaan.

  • Wanneer je fetch, Git verzamelt alle commits van de doelvertakking die niet bestaan ​​in je huidige branch en slaat ze op in uw lokale repository. Echter, het voegt ze niet samen met je huidige branch. Dit is met name handig als u uw repository up-to-date wilt houden, maar werkt aan iets dat kan breken als u uw bestanden bijwerkt. Om de commits in je master branch te integreren, gebruik je merge.


1849
2017-08-18 08:53



Het is belangrijk om de ontwerpfilosofie van git te vergelijken met de filosofie van een meer traditionele bronbesturingstool zoals SVN.

Subversion is ontworpen en gebouwd met een client / server-model. Er is een enkele repository die de server is en verschillende clients kunnen code ophalen van de server, eraan werken en deze vervolgens opnieuw toewijzen aan de server. De aanname is dat de klant altijd contact met de server kan opnemen wanneer hij een bewerking moet uitvoeren.

Git is ontworpen om een ​​meer gedistribueerd model te ondersteunen zonder een centrale repository nodig te hebben (hoewel je er zeker een kunt gebruiken als je dat wilt). Ook is git zo ontworpen dat de client en de "server" niet tegelijkertijd online hoeven te zijn. Git is zo ontworpen dat mensen op een onbetrouwbare link zelfs via e-mail code kunnen uitwisselen. Het is mogelijk om volledig losgekoppeld te werken en een CD te branden om via git code uit te wisselen.

Om dit model te ondersteunen, onderhoudt Git een lokale repository met uw code en ook een extra lokale repository die de status van de externe repository weerspiegelt. Door een kopie van de externe repository lokaal te houden, kan git de benodigde wijzigingen achterhalen, zelfs wanneer de externe repository niet bereikbaar is. Later, wanneer u de wijzigingen naar iemand anders moet verzenden, kan git ze als een set van wijzigingen overdragen vanaf een tijdstip dat bekend is in de externe repository.

  • git fetchis de opdracht die zegt: "Breng mijn lokale kopie van de externe repository up-to-date."

  • git pull zegt: "breng de wijzigingen in de externe repository waar ik mijn eigen code bewaar."

Normaal gesproken git pull doet dit door a te doen git fetch om het lokale exemplaar van de externe repository up-to-date te brengen en de wijzigingen vervolgens samen te voegen in uw eigen coderepository en eventueel uw werkkopie.

De take-away is om in gedachten te houden dat er vaak op zijn minst zijn drie exemplaren van een project op uw werkstation. Eén kopie is je eigen repository met je eigen commit-geschiedenis. Het tweede exemplaar is uw werkkopie waar u aan het bewerken en bouwen bent. Het derde exemplaar is uw lokale "cache" -kopie van een externe repository.


1007
2018-03-31 18:43



Hier is Oliver Steele's beeld van hoe het allemaal bij elkaar past:

enter image description here

Als er voldoende interesse is, zou ik denk ik de afbeelding kunnen bijwerken om toe te voegen git clone en git merge...


660
2018-06-09 13:30



Eén gebruikscasus van git fetch is dat het volgende u eventuele wijzigingen in de remote branch vertelt sinds uw laatste pull ... dus u kunt controleren voordat u een echte pull uitvoert, wat de bestanden in uw huidige branch en werkkopie zou kunnen veranderen.

git fetch
git diff ...origin

427
2018-05-07 19:23



Het kostte me een beetje om te begrijpen wat het verschil was, maar dit is een eenvoudige verklaring. master in uw localhost is een filiaal.

Wanneer je een repository kloont, haal je de volledige repository naar je lokale host. Dit betekent dat je op dat moment een origin / master pointer naar hebt HEAD en meester wijzend naar hetzelfde HEAD.

als je begint te werken en commits uitvoert, ga je de hoofdwijzer naar HEAD + je commits. Maar de oorsprong / meester-aanwijzer wijst nog steeds naar wat het was toen u kloneerde.

Dus het verschil zal zijn:

  • Als je dat doet git fetch het haalt alleen alle wijzigingen in de externe repository op (GitHub) en verplaats de origin / master pointer naar HEAD. Ondertussen zal uw plaatselijke filiaalmeester blijven wijzen naar waar hij is.
  • Als je dat doet git pull, het zal in principe fetch doen (zoals eerder uitgelegd) en nieuwe wijzigingen in je master branch samenvoegen en de pointer naar verplaatsen HEAD.

341
2018-05-11 18:37



Soms helpt een visuele representatie.

enter image description here


179
2018-01-25 17:28



Kort

git fetch is gelijkaardig aan pull maar fuseert niet. dat wil zeggen dat het externe updates ophaalt (refs en objects) maar uw lokale blijft hetzelfde (d.w.z. origin/master wordt bijgewerkt maar master blijft gelijk) .

git pull naar beneden trekken van een afstandsbediening en direct samenvoegen.

Meer

git clone klonen een repo.

git rebase spaart spullen van je huidige branch die niet in de upstream-branch is naar een tijdelijk gebied. Uw branch is nu hetzelfde als voordat u met uw wijzigingen begon. Zo, git pull -rebase zal de veranderingen op afstand naar beneden trekken, uw lokale filiaal terugspoelen, uw wijzigingen één voor één over de huidige vertakking herhalen tot u op de hoogte bent.

Ook, git branch -a zal u precies laten zien wat er met al uw vestigingen gebeurt - lokaal en op afstand.

Deze blogpost was nuttig:

Het verschil tussen git pull, git fetch en git clone (en git rebase) - Mike Pearce

en covers git pull, git fetch, git clone en git rebase.

====

BIJWERKEN

Ik dacht dat ik dit zou bijwerken om te laten zien hoe je dit in de praktijk zou gebruiken.

  1. Update uw lokale repository van de afstandsbediening (maar voeg niet samen):

    git fetch

  2. Na het downloaden van de updates, laten we de verschillen zien:

    git diff master origin / master

  3. Als je tevreden bent met deze updates, voeg je het volgende samen:

    git pull

Opmerkingen:

Bij stap 2: voor meer informatie over diff's tussen lokale en afstandsbedieningen, zie: lokale git branch vergelijken met remote branch?

In stap 3: Het is waarschijnlijk nauwkeuriger (bijvoorbeeld op een snel veranderende repo) om a te doen git rebase origin hier. Zie @Justin Ohms commentaar in een ander antwoord.

Zie ook: http://longair.net/blog/2009/04/16/git-fetch-and-merge/ 


165
2018-04-13 17:31



git-pull - Haal op van en voeg in met een andere repository of een lokale branch
KORTE INHOUD

git trek ...
BESCHRIJVING

Voert git-fetch uit met de gegeven parameters, en roept git-merge om de
teruggehaald hoofd (s) in de huidige tak. Met --rebase roept u git-rebase aan
in plaats van git-merge.

Merk op dat je kunt gebruiken. (huidige map) als de <repository> om te trekken
van de lokale repository - dit is handig bij het samenvoegen van lokale vestigingen
in de huidige tak.

Merk ook op dat opties bedoeld zijn voor git-pull zelf en onderliggende git-merge
moet worden gegeven voor de opties die zijn bedoeld voor git-fetch.

Je zou trekken als je de geschiedenis samengevoegd wilt hebben, je zou het halen als je de codez wilt 'zoals sommige mensen hier wat artikelen hebben getagd.


155
2017-11-15 09:52