Close

git fetch

Met de opdracht git fetch kun je commits, bestanden en refs downloaden van een externe repository naar je lokale repo. Fetchen doe je als je wilt zien waar de rest aan heeft gewerkt. Het is vergelijkbaar met svn update omdat het laat zien hoe de centrale geschiedenis zich heeft ontwikkeld, maar het dwingt je niet om de wijzigingen toe te voegen aan je repository. Git isoleert opgehaalde content uit bestaande lokale content. Het heeft absoluut geen effect op je lokale werk op het gebied van ontwikkeling. Opgehaalde content moet expliciet uitgecheckt worden met de opdracht git checkout. Op deze manier is fetchen of ophalen een veilige manier om commits te controleren voordat je ze in je lokale repository integreert.

Als je content downloadt van een externe repo, kun je de opdrachten git pull en git fetch gebruiken om de taak te voltooien. Je kunt git fetch beschouwen als de 'veilige' versie van de twee opdrachten. Hiermee download je de externe content, maar wordt de werkstatus van je lokale repo niet bijgewerkt en blijft je huidige werk intact. git pull is een agressiever alternatief en downloadt de content voor de actieve lokale branch en git merge wordt onmiddellijk uitgevoerd om een samengevoegde commit aan te maken voor de nieuwe externe content. Als je wijzigingen in de wachtrij hebt staan, veroorzaakt dit conflicten en wordt de oplossing gestart voor conflicten met samenvoegen.


Hoe git fetch werkt met externe branches


Laten we, om beter te begrijpen hoe git fetch werkt, kijken hoe Git commits organiseert en opslaat. Achter de schermen, in de map ./.git/objects van de repository, slaat Git alle lokale en externe commits op. Git houdt externe en lokale branch-commits strikt gescheiden door branch-refs te gebruiken. De refs voor lokale branches worden opgeslagen in ./.git/refs/heads/. Als de opdracht git branch wordt gebruikt, wordt er een lijst met de lokale branch-refs weergegeven. Hier volgt een voorbeeld van een git branch output met een paar voorbeeld branchnamen.

git branch
main
feature1
debug2

Als we de content van de /.git/refs/heads/ directory nader bekijken, zien we dezelfde output.

ls ./.git/refs/heads/
main
feature1
debug2
Consolevenster
gerelateerd materiaal

Uitgebreid Git log

Logo Bitbucket
Oplossing bekijken

Git leren met Bitbucket Cloud

Externe branches zijn vergelijkbaar met lokale branches, alleen kunnen ze gekoppeld worden aan commits van een repository van iemand anders. Externe branches hebben een voorvoegsel van de externe repo waar ze bij horen, zodat je ze niet verwart met lokale branches. Net zoals lokale branches heeft Git ook refs voor externe branches. Refs van een externe branch staan in de map ./.git/refs/remotes/. Het volgende fragment van een voorbeeldcode toont de branches die je kunt zien na het ophalen van een externe repo met de makkelijke naam remote-repo:

git branch -r
# origin/main
# origin/feature1
# origin/debug2
# remote-repo/main
# remote-repo/other-feature

Deze output toont de lokale branches die we eerder hebben bekeken, maar nu voorafgegaan door origin/. Verder zien we nu ook dat de remote branches voorafgegaan worden door remote-repo. Je kunt een externe branch bekijken net zoals een lokale branch, maar je komt dan wel in de status detached HEAD (net als bij het bekijken van een oude commit). Je kunt ze zien als alleen-lezen branches. Om je externe branches te bekijken, verplaats je gewoon de markering -r naar de opdracht git branch.

Je kunt externe branches inspecteren met de gebruikelijke opdrachten git checkout en git log. Als je de wijzigingen in een externe branch goedkeurt, kun je deze samenvoegen in een lokale branch met een normale git merge. Dus, anders dan bij SVN, is het synchroniseren van je lokale repository met een externe repository een tweeledig proces: ophalen en vervolgens samenvoegen. De opdracht git pull is een handige shortcut voor dit proces.

Opdrachten en opties voor Git fetch


git fetch <remote>

Haal alle branches op uit de repository. Hiermee worden ook alle vereiste commits en bestanden gedownload uit de andere repository.

git fetch <remote> <branch>

Zelfde als de opdracht hierboven, maar alleen de gespecificeerde branch ophalen.

git fetch --all

Een krachtige move waarmee alle geregistreerde externen en hun branches worden opgehaald:

git fetch --dry-run

De optie --dry-run voert een demo run uit van de opdracht. Er worden voorbeelden gegeven van acties die genomen worden tijdens het ophalen, maar ze worden niet toegepast.

Voorbeelden van Git fetch


Een externe branch git fetch-en

Het volgende voorbeeld illustreert hoe je een externe branch kunt ophalen en je lokale werkstatus kunt bijwerken naar de externe content. We gaan er in dit voorbeeld van uit dat er een centrale repo oorsprong is aan de hand waarvan de lokale repository is gekopieerd met de opdracht git clone. We gaan er ook van uit dat er een extra externe repository met de naam coworkers_repo is, die een feature_branch bevat die we gaan configureren en ophalen. Laten we met deze aannames verder gaan met het voorbeeld.

Allereerst moeten we de externe repo configureren met behulp van de opdracht git remote.

git remote add coworkers_repo git@bitbucket.org:coworker/coworkers_repo.git

Hier hebben we een referentie aangemaakt naar de repo van de collega's met behulp van de repo URL. We sturen de externe naam nu door naar git fetch om de content te downloaden.

git fetch coworkers_repo coworkers/feature_branch
fetching coworkers/feature_branch

We hebben nu lokaal de inhoud van coworkers/feature_branch en moeten dit integreren in ons lokale werkexemplaar. We beginnen dit proces door de opdracht git checkout te gebruiken om de net gedownloade externe branch uit te checken.

git checkout coworkers/feature_branch
Note: checking out coworkers/feature_branch'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

git checkout -b <new-branch-name>

De output van deze checkout geeft aan dat we ons in de status detached HEAD bevinden. Dit is verwacht en betekent dat onze HEAD-ref verwijst naar een ref die niet in lijn is met onze lokale geschiedenis. Omdat HEAD verwijst naar de ref coworkers/feature_branch, kunnen we een nieuwe lokale branch aanmaken uit die ref. De output 'detached HEAD' geeft aan hoe we dit moeten doen met de opdracht git checkout:

git checkout -b local_feature_branch

Hier hebben we een nieuwe lokale branch aangemaakt met de naam local_feature_branch. Dit zorgt ervoor dat updates HEAD verwijst naar de laatste externe content en vanaf dit punt kunnen we hierop verder ontwikkelen.

Oorsprong synchroniseren met git fetch

In het volgende voorbeeld wordt de standaardprocedure besproken voor het synchroniseren van je lokale repository met de main-branch van de centrale repository.

git fetch origin

Dit geeft de gedownloade branches weer:

a1e8fb5..45e66a4 main -> origin/main
a1e8fb5..9e8ab1c develop -> origin/develop
* [new branch] some-feature -> origin/some-feature

De commits van deze nieuwe externe branches worden in het diagram hieronder weergegeven als vierkanten in plaats van cirkels. Zoals je kunt zien, geeft git fetch je toegang tot de volledige structuur van de branch van een andere repository.

Diagram van origin- naar main-branches

Om te bekijken welke commits zijn toegevoegd aan de stroomopwaartse main, kun je een git log uitvoeren met origin/main als filter:

git log --oneline main..origin/main

Om wijzigingen goed te keuren en ze toe te voegen aan je lokale main-branch gebruik je de volgende opdrachten:

git checkout main
git log origin/main

Vervolgens kunnen we git merge origin/main gebruiken:

git merge origin/main

De origin/main- en main-branches verwijzen nu naar dezelfde commit en je bent gesynchroniseerd met de stroomopwaartse ontwikkelingen.

Samenvatting git fetch


Tijdens beoordeling is git fetch een belangrijke opdracht die wordt gebruikt om inhoud te downloaden van een externe repository. git fetch wordt gebruikt in combinatie met git remote, git branch, git checkout en git reset om een lokale repository bij te werken met de status van een externe. De opdracht git fetch is een cruciaal onderdeel van de gezamenlijke Git-workflows. git fetch gedraagt zich vergelijkbaar met git pull, maar git fetch kan als een veiligere, niet-destructieve versie worden beschouwd.


Deel dit artikel
Volgend onderwerp

Aanbevolen artikelen

Bookmark deze resources voor meer informatie over soorten DevOps-teams of voor voortdurende updates over DevOps bij Atlassian.

Mensen die samenwerken met een muur vol tools

Bitbucket-blog

Toelichting DevOps

DevOps-leertraject

Demo Den Feature-demo's met Atlassian-experts

Hoe Bitbucket Cloud werkt met Atlassian Open DevOps

Meld je aan voor onze DevOps-nieuwsbrief

Thank you for signing up