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
gerelateerd materiaal
Uitgebreid Git log
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.
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.